1、几个核心类
AopAutoConfiguration
org.aspectj.weaver.Advice
AspectJAutoProxyingConfiguration
@EnableAspectJAutoProxy
AspectJAutoProxyRegistrar
AnnotationAwareAspectJAutoProxyCreator
AspectJAwareAdvisorAutoProxyCreator
AbstractAdvisorAutoProxyCreator
AbstractAutoProxyCreator(入口)
SmartInstantiationAwareBeanPostProcessor(1)
InstantiationAwareBeanPostProcessor(2)
BeanPostProcessor(3)
(1)的实现方法:
predictBeanType---
determineCandidateConstructors---
getEarlyBeanReference
(2)的实现方法:
postProcessBeforeInstantiation---1
postProcessAfterInstantiation---2
postProcessProperties---3
(3)的实现方法:
postProcessBeforeInitialization---4
postProcessAfterInitialization---5
BeanFactoryTransactionAttributeSourceAdvisor
AbstractBeanFactoryPointcutAdvisor
AbstractPointcutAdvisor
PointcutAdvisor
Advisor
2、大概过程
找到Advisor;
创建代理对象;
3、spring boot中如何开启事务
1、标注@EnableTransactionManagement
2、Import TransactionManagementConfigurationSelector
2-1、Import AutoProxyRegistrar(6)
2-2、Import ProxyTransactionManagementConfiguration(3、4、5)
3、BeanFactoryTransactionAttributeSourceAdvisor
4、AnnotationTransactionAttributeSource
5、TransactionInterceptor
6、InfrastructureAdvisorAutoProxyCreator
7、AbstractAutoProxyCreator
7-1、找出指定bean对应的增强器:
AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
|
AbstractAdvisorAutoProxyCreator#findEligibleAdvisors
|
AbstractAdvisorAutoProxyCreator#findCandidateAdvisors
|
BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans(获得所有的Advisor,排除正在创建的)
|
AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply
|
AopUtils#findAdvisorsThatCanApply(得到对应的Advisor)---8
|
AspectJAwareAdvisorAutoProxyCreator#extendAdvisors
|
AbstractAdvisorAutoProxyCreator#sortAdvisors(排序)
|
返回得到的增强器
8、对于如何得到对应的增强器:
8-1、首先处理IntroductionAdvisor类型的
8-2、处理PointcutAdvisor类型(就是上面的3)
8-3、获取上面那步的Pointcut(通过4创建TransactionAttributeSourcePointcut)
AbstractFallbackTransactionAttributeSource#getTransactionAttribute
|
AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
|
AnnotationTransactionAttributeSource#findTransactionAttribute
|
AnnotationTransactionAttributeSource#determineTransactionAttribute
|
SpringTransactionAnnotationParser#parseTransactionAnnotation(看到了Transactional注解)
事务属性的获取规则:
方法中存在,就使用方法上的;
否则使用方法所在类上的;
在使用接口中的;
接口的类上的
9、SpringTransactionAnnotationParser
parseTransactionAnnotation方法解析出下面属性:
propagation:
isolation
timeout
readOnly
value
rollbackFor
rollbackForClassName
noRollbackFor
noRollbackForClassName
构造出RuleBasedTransactionAttribute
10、下面就该看看实际的增强器,就是上面一直没说到的5TransactionInterceptor
核心方法:invoke
|
TransactionAspectSupport#invokeWithinTransaction
11、事务的传播行为:
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NEVER
PROPAGATION_NESTED
12、隔离级别:
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE