【一】spring事務管理
(1)spring的事務管理,是基于aop動态代理實作的。對目标對象生成代理對象,加入事務管理的核心攔截器==>org.springframework.transaction.interceptor.TransactionInterceptor。
===>spring事務管理的核心攔截器
===>需要配置的資料項:事務管理機制配置屬性的查找類transactionAttributeSource,事務管理的核心處理器PlatformTransactionManager(如果能配置就配置,不能配置就從beanFactory中根據接口拿)
(2)實作事務管理需要配置事務管理處理器(事務處理的支援抽象封裝(擷取事務狀态,送出事務,回歸事務),如下是spring事務管理器的基礎類。
==>org.springframework.transaction.PlatformTransactionManager
==>org.springframework.transaction.support.AbstractPlatformTransactionManager
(3)擷取将要執行的方法的事務政策的配置資訊的查詢器。
==>org.springframework.transaction.interceptor.TransactionAttributeSource
==>org.springframework.transaction.annotation.AnnotationTransactionAttributeSource(基于注解進行事務管理配置的屬性擷取器)
==>該類内部也做屬性配置緩存。以要執行的方法的對象Method method,和要執行的bean的Class<?> targetClass組裝成org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource.DefaultCacheKey.該類重寫了equals和hashCode方法。
(4)spring事務管理的配置屬性的實體類
==>org.springframework.transaction.interceptor.TransactionAttribute
==>org.springframework.transaction.interceptor.DefaultTransactionAttribute(spring的預設)
==>org.springframework.transaction.interceptor.RuleBasedTransactionAttribute(基于注解的事務管理配置屬性的類)
==>其實就是,事務的傳播機制,事務復原政策等配置資訊
(5)spring事務管理的一個FactoryBean
==>org.springframework.transaction.interceptor.TransactionProxyFactoryBean
==>内部初始化TransactionInterceptor,配置項:可以配置事務管理攔截器增強之外的别的攔截器,需要進行事務管理的的target, 進行事務管理的目标的接口proxyInterfaces
==>該類内部會調用afterPropertiesSet()方法,對目标target類生成一個代理對象。最終傳回給業務使用。
【二】事務管理攔截器的執行過程TransactionInterceptor的invoke(final MethodInvocation invocation)方法
(1)擷取要進行事務管理的業務類的class的類對象
(2)根據類對象class和要執行的方法的method對象,基于事務管理配置屬性查詢器擷取事務機制的屬性TransactionAttribute
(3)根據事務配置機制的屬性擷取事務管理的處理器PlatformTransactionManager
(4)根據類對象class和要執行的方法method對象擷取事務管理,連接配接點辨別joinpointIdentification(類的全路徑+執行方法的名字)
(5)根據事務管理處理器PlatformTransactionManager,事務機制配置屬性TransactionAttribute,事務連接配接點辨別joinpointIdentification擷取目前事務資訊TransactionInfo
(6)繼續執行下一個攔截器或目标業務管理bean的方法
(7)根據(6)的執行結果進行相應的事務操作
(8)如果(6)沒有抛出異常,則先根據TransactionInfo進行相關資源的清理,然後根據TransactionInfo進行事務送出操作
(9)如果(6)抛出異常,則根據TransactionInfo進行事務復原操作
【三】以xml配置方式進行事務管理的初始化原了解析
(1) 以下配置是事務管理機制屬性配置

View Code
(2) 在spring的IOC階段是用org.springframework.transaction.config.TxNamespaceHandler進行解析該<tx:advice>配置,調用解析器org.springframework.transaction.config.TxAdviceBeanDefinitionParser
==>如果沒有attributes的配置,則預設的配置屬性查詢器為org.springframework.transaction.annotation.AnnotationTransactionAttributeSource
==>如果attributes的配置大于1個。報錯
==>如果attributes的配置等于1個。
>則解析 <tx:method>的配置。并為每一個method的配置形成一個org.springframework.transaction.interceptor.RuleBasedTransactionAttribute的對象。如果有回歸政策則形成org.springframework.transaction.interceptor.RollbackRuleAttribute配置。将所有的method配置形成ManagedMap<TypedStringValue, RuleBasedTransactionAttribute> transactionAttributeMap集合
>解析完method後,則想IOC注入事務屬性配置查詢器為org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource.将method解析後的transactionAttributeMap的集合指派給其屬性nameMap
==>想builder解析上下文注冊了兩個屬性transactionAttributeSource(事務管理機制屬性的查詢器),transactionManager(事務管理的處理器)
==>解析tx的配置,最終形成的advisor是org.springframework.transaction.interceptor.TransactionInterceptor.其依賴了剛才解析的事務管理機制屬性查詢器transactionAttributeSource,和事務管理處理器transactionManager
(3)在spring的IOC階段用的是org.springframework.aop.config.AopNamespaceHandler進行解析 <aop:config >該配置。調用的解析器為org.springframework.aop.config.ConfigBeanDefinitionParser
==>預設會向IOC容器中注冊bean實力化的前後置處理器org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator(BeanPostProcessor接口實作類)
==>解析<aop:advisor>是向IOC容器中注冊org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor.并建立txAdvice和txPointcut的依賴關系
==>解析<aop:pointcut>是向IOC容器中注冊org.springframework.aop.aspectj.AspectJExpressionPointcut
=====================================================分割線========================================================
*****spring事務管理是基于對資料庫連結的管理。以下所涉及的類,都是對資料庫DataSource的直接管理,進而對資料庫連結Connection的間接管理進而隐式進行資料庫事務管理******
【一】org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
==>該類對DataSource進行動态代理,但傳回的代理對象是Connection.具體的操作見TransactionAwareInvocationHandler的invoke方法。
==>在對資料庫做任何操作的時候,都在invoke方法中。
【二】org.springframework.jdbc.datasource.TransactionAwareInvocationHandler
==>該類屬性targetDataSource引用的是真正的DataSource實作。
==>該類屬性target引用的是由 DataSourceUtils類通過targetDataSource擷取的一個資料庫連結,該連結與目前線程進行綁定。
==>在事務管理過程中Connection做的任何操作,都是代理對象進行操作的。都會調用該類的invoke方法,通過該方法對目前線程的事務管理進行綁定解綁等等操作。
【三】org.springframework.jdbc.datasource.DataSourceUtils
==>該類是從DataSource擷取資料庫連結,并結合Spring的TransactionSynchronizationManager類進行事務管理的相關操作
==>主要有擷取Connection,釋放Connection等相關操作。
【四】org.springframework.transaction.support.TransactionSynchronizationManager
==>對目前線程或目前事務的一些操作進行管理的操作類
==>可以在目前事務中注冊一些事件執行。TransactionSynchronization接口的實作類
【五】org.springframework.transaction.support.TransactionSynchronization
==>該類定義一些事務處理過程中的一些事件處理回調方法。
==>例子:org.activiti.spring.TransactionSynchronizationAdapter
==>org.activiti.spring.SpringTransactionContext
(1)一個小案例,當事務送出後釋出異步事件進行相應操作。如果事務未送出,復原。則不釋出該事件

(2)測試線程保管箱,用于說明TransactionSynchronizationManager屬性中不同的線程保管箱的聲明,是用于記錄不同線程的事務管理的資訊的存儲。各個線程的事務資訊是互不幹擾和影響的。

========================================xml方式配置事務管理,spring向IOC注冊的核心關鍵類================================
(1)org.springframework.transaction.PlatformTransactionManager(事務管理的核心類)
==>該接口定義了三個方法,擷取事務狀态,送出事務,復原事務
==>org.springframework.transaction.support.AbstractPlatformTransactionManager.該類對PlatformTransactionManager的三個方法進行重寫,并寫成模闆方法。在再類内部定義各種方法,由子類實作。其中,commit(TransactionStatus status),rollback(TransactionStatus status)是final方法,不允許被重寫。
==>jpa的事務管理的核心類:org.springframework.orm.jpa.JpaTransactionManager
(2)org.springframework.transaction.interceptor.TransactionAttributeSource(事務屬性的接口,主要指事務的傳播機制,是否隻讀事務,什麼異常復原等屬性)
==>org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource(事務屬性的一個實作類,是xml方式配置的方法表達式定義事務屬性的核心實作類)
==>該類記錄了,所切的業務方法的事務傳播機制等屬性配置資訊。
==>該接口就定義了該方法,擷取事務配置屬性。TransactionAttribute getTransactionAttribute(Method method, Class<?> targetClass);
(3)org.springframework.transaction.interceptor.TransactionAttribute
===>事務配置屬性
===>xml方式配置的事務屬性,org.springframework.transaction.interceptor.RuleBasedTransactionAttribute(事務傳播機制,是否隻讀的配置屬性)
===>xml方式配置的事務屬性,org.springframework.transaction.interceptor.RollbackRuleAttribute(事務復原的配置屬性)
===>xml方式配置的事務屬性,org.springframework.transaction.interceptor.NoRollbackRuleAttribute(事務不復原的配置屬性)
===>tx的配置,會将配置的類加入到ManagedMap<TypedStringValue, RuleBasedTransactionAttribute> transactionAttributeMap
(4)xml方式配置的事務攔截器

===>org.springframework.transaction.interceptor.TransactionInterceptor
===>該類中存儲了,事務配置的屬性NameMatchTransactionAttributeSource,事務管理JpaTransactionManager
(5)xml方式配置的事務aop代理

===>pointcut向IOC容器中注冊:org.springframework.aop.aspectj.AspectJExpressionPointcut (比對包名,決定對那些類進行事務管理,切面的定義)
===>AspectJExpressionPointcut類是org.springframework.aop.ClassFilter和org.springframework.aop.MethodMatcher和org.springframework.aop.Pointcut的實作類,用于判斷目前類,是否要進行代理。
===>advisor向IOC容器中注冊:org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor(這将來會在IOC申請Bean的時候,被編制到代理對象裡的代理鍊條中,用于進行事務管理),該類有攔截器(增強,事務管理的攔截器機制)+切面(表達式決定那些類會被進行事務管理)
(6)spring進行事務管理的結構
==========================================Annotation方式進行spring事務管理=============================

(1)org.springframework.transaction.event.TransactionalEventListenerFactory
===>該類是org.springframework.context.event.EventListenerFactory
===>暫時不知道什麼作用。
(2)org.springframework.transaction.config.internalTransactionalEventListenerFactory
(3)org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator
==>該類是org.springframework.beans.factory.config.BeanPostProcessor接口的實作類,會在IOC容器申請bean的時候,對bean進行加工,形成具有事務管理的代理對象,傳回。
(4)org.springframework.transaction.annotation.AnnotationTransactionAttributeSource
==>該類是事務管理配置屬性的類的查找。
(5)org.springframework.transaction.interceptor.TransactionInterceptor
==>該類擁有事務管理的transcationManage和AnnotationTransactionAttributeSource
(6)org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor
===>該類擁有TransactionInterceptor和AnnotationTransactionAttributeSource
InfrastructureAdvisorAutoProxyCreator在申請bean的時候,會根據目前的class找到beanFactory裡所有的advisor,然後從所有的Advisor中找到有資格作為該class的advisor,如果存在,則建立代理對象傳回。Advisor裡有PointCut來界定是否支援。
============================================spring架構的基礎架構和實作政策=================================================
spring的IOC容器
(1)解析xml,将所有bean加載成BeanDefinition形式存儲在DefaultListableBeanFactory中。
(2)控制依賴反轉注入,向IOC容器中申請bean,建立bean,傳回注入bean(遞歸形式進行鍊式注入,在建立的過程中對其進行前後加工bean,生成代理對象,或改變行為,注入屬性)
spring的AOP代理
(1)會有一個建立代理對象的BeanPostProcessor接口實作對象,會在建立bean的前後進行處理bean,最終傳回該bean一個代理對象。
(2)先在IOC容器中查找到所有的Advisor(增強+切面定義),然後在所有的Advisor中根據bean的class屬性,進行比對,看目前class是否需要增強。
(3)通過切面定義對class進行判定(Pointcut,ClassFilter,MethodMatcher),如果适合,收集起所有的Advisor,然後根據Order接口定義的優先級,進行排序。
(4)根據配置,生成代理對象,并傳回代理對象,注入到要依賴的對象裡。未來調用的時候進行增強邏輯的執行。