1.注入4个bd
InfrastructureAdvisorAutoProxyCreator 父类:AbstractAutoProxyCreator
BeanFactoryTransactionAttributeSourceAdvisor 父类:Advisor
TransactionInterceptor 父类:Advice
AnnotationTransactionAttributeSource
2.执行
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
逻辑分析:遍历所有的bd:
获取beanname->判断beanname是否有长度并且没有被处理过->是否遍历放入advisedBeans->
是否是基础类->是否该跳过
4大基础类
3.执行org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
判断是否需要增强逻辑:
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
根据切面创建代理逻辑:
寻找所有的advisor
org.springframework.aop.support.AopUtils#findAdvisorsThatCanApply
寻找所有advisor且可以申请使用的bean
org.springframework.aop.support.AopUtils#canApply(org.springframework.aop.Advisor, java.lang.Class<?>, boolean)
org.springframework.transaction.interceptor.TransactionAttributeSourcePointcut#matches
org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource#getTransactionAttribute
org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
1.首先去类对应的方法中寻找是否有@Transaction
2.方法找不到去类上找
3.类上找不到再去接口方法找
4.接口方法找不到再去接口找,
4步都找不到那么直接返回null,找到了就创建代理对象。