1 InfrastructureAdvisorAutoProxyCreator:BeanPostProcessor
2 BeanFactoryTransactionAttributeSourceAdvisor:PointcutAdvisor,持有3和4
3 AnnotationTransactionAttributeSource: 解析和缓存方法和类上的Transactional注解
4 TransactionInterceptor: MethodInterceptor,Advice
1 在postProcessAfterInitialization时找到beanFactory内的2,2的Pointcut是否匹配呢,2的ClassFilter没问题,2的MethodMatcher(注意这里需遍历Class内各方法,任一方法匹配即可)查看3内是否存在Transactional注解(缓存查找或解析),最后决定2是否作为代理Advisor一员,无Advisor列表不代理,否则创建代理,创建ProxyFactory并调用其getProxy方法(内部创建了DefaultAopProxyFactory,dapf根据多个因素判断创建JdkDynamicAopProxy还是CglibAopProxy,JdkDynamicAopProxy调用Proxy.newProxyInstance生成代理对象),JdkDynamicAopProxy本身作为InvocationHandler,其invoke方法内根据Advisor列表构建最后的Advice(MethodInterceptor)列表(注意此时已有确定的方法,MethodMatcher匹配一下), 构建ReflectiveMethodInvocation并在其内调用各MethodInterceptor和最后的方法调用,其中TransactionInterceptor在内进行事务操作
默认只在Error与RuntimeException下回滚(DefaultTransactionAttribute)
@Transactional 失效:
1 调用当前类的@Transactional 方法
无论jdk还是cglib代理都存在代理对象和原始对象,即内层方法是原始对象调用的
只要有一个方法需要代理,都会生成代理对象,即导致所有方法都是在代理对象上调用
2 非public方法
3 catch了异常,导致无法回滚
4 传播行为或rollbackFor 导致未开启或不回滚