Spring、Hibernate 事務流程分析-Session生命周期
TransactionInterceptor(Spring事務架構的具體使用場景) -> invoke方法:

方法意圖大致為獲取當前方面的事務屬性,然后調用父類TransactionAspectSupport的createTransactionIfNecessary()方法去獲取事務(根據需要創建事務)。
TransactionAspectSupport -> createTransactionIfNecessary方法:

到PlatformTransactionManager中獲取當前事務狀態對象。而這里講的是HibernateTransactionManager,而AbstractPlatformTransactionManager又是所有事務管理類的基類(如: HibernateTransactionManager)。
AbstractPlatformTransactionManager -> getTransaction方法

事務在第一次並且傳播屬性是上面那些屬性時,會調用newTransactionStatus方法創建TransactionStatus。
AbstractPlatformTransactionManager -> newTransactionStatus方法:

在newTransactionStatus方法中,會初始化TransactionSynchronzationManager屬性(這對后面的獲取session很有幫助),並創建DefaultTransactionStatus返回。
上面大概為一個Spring托管的事務的初始化流程。
下面看HibernateDaoSupport流程。
在HibernateDaoSupport中,不管是getSession()方法還是通過hibernateTemplate.execute(HibernateCallback)最終都會調用SessionFactoryUtils.getSession()。
HibernateDaoSupport -> getSession方法:

getSession() 會使用HibernateTemplate的allowCreate屬性,而HibernateTemplate的allowCreate默認是true。 所以會調用后面的SessionFactoryUtils.getSession()方法。
HibernateTemplate -> getSession方法:


可看到HibernateTemplate最終默認也會調用SessionFactoryUtils.getSession()方法。
SessionFactoryUtils -> getSession方法:
getSession會調用內部的doGetSession()方法:


由於前面講到的事務初始化過程中, 容器會將TransactionSynchronizationManager.isSynchronizationActive()變成true。所以在Spring管理事務的情況下, Spring會自動將Session綁定到事務資源管理器上(TransactionSynchronizationManager類)。而我們知道事務資源管理器內部使用了ThreadLocal類,這樣即實現了線程安全的一次請求一次Session的管理方式。
再次回到TransactionInterceptor類

這里我們可追蹤complateTransactionAfterThrowing和commitTransactionAfterReturning方法,會發現這2個方法最終都會調用AbstractPlatformTransactionManager. doCleanupAfterCompletion方法去完成清理工作。進入HibernateTransactionManager的對應方法(因為它重寫了父類doCleanupAfterCompletion方法)。
HibernateTransactionManager -> doCleanupAfterCompletion方法:

可看到在此方法中, 會將綁定在資源管理器上的資源全解綁。 然后將session關閉。
至此,Spring托管的事務管理並且使用了HibernateDaoSupport或者HibernateTemplate的應用場景中,Session的完整生命周期介紹完畢。
