回顾下AOP相关知识点:
- 静态代理与JDK动态代理与CGLIB动态代理
- Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别
- spring源码系列8:AOP源码解析之代理的创建
我们总结出AOP公式
- JDK动态代理(Proxy+InvocationHandler)+advised
- CGLB动态代理(Enhancer+MethodInterceptor)+advised
本质都是在内存中生成了新的字节码类。
这节我们看看事务是如何利用AOP实现的。
事务代理生成过程
一、@EnableTransactionManagement配置事务环境
@EnableTransactionManagement的@Import(TransactionManagementConfigurationSelector.class)引入TransactionManagementConfigurationSelector.class。此类
@Override protected String[] selectImports(AdviceMode adviceMode) { switch (adviceMode) { case PROXY: return new String[] {AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()}; case ASPECTJ: return new String[] { TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME}; default: return null; } }
PROXY:情况下,会注册两个类:
>AutoProxyRegistrar:
实现了ImportBeanDefinitionRegistrar。其接口方法registerBeanDefinitions会向仓库注册Bean定义
InfrastructureAdvisorAutoProxyCreator。 InfrastructureAdvisorAutoProxyCreator
继承了AbstractAdvisorAutoProxyCreator间接继承了AbstractAutoProxyCreator
在AOP代理生成那一节,我们讲过。AnnotationAwareAspectJAutoProxyCreator
也是间接继承了AbstractAutoProxyCreator
。
在AOP实现原理中AbstractAutoProxyCreator
做了大部分工作。
从这一点看,事务代理对象创建过程,与AOP代理对象过程是一样的,关键就在这个AbstractAutoProxyCreator类
>ProxyTransactionManagementConfiguration
是一个@Configuration。有三个@Bean注解方法。
- transactionAdvisor()
- transactionAttributeSource()
- transactionInterceptor()
@Configuration public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration { @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() { BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor(); advisor.setTransactionAttributeSource(transactionAttributeSource()); advisor.setAdvice(transactionInterceptor()); advisor.setOrder(this.enableTx.<Integer>getNumber("order")); return advisor; } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionAttributeSource transactionAttributeSource() { return new AnnotationTransactionAttributeSource(); } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionInterceptor transactionInterceptor() { TransactionInterceptor interceptor = new TransactionInterceptor(); interceptor.setTransactionAttributeSource(transactionAttributeSource()); if (this.txManager != null) { interceptor.setTransactionManager(this.txManager); } return interceptor; } }
1.BeanFactoryTransactionAttributeSourceAdvisor:
首先:transactionAdvisor()方法会向仓库中注册一个BeanFactoryTransactionAttributeSourceAdvisor。
从其继承关系上看,他是一个Advisor,并且还是PointcutAdvisor.关于Advisor,上节我们分析过他是封装了(Advice+Pointcut)
既然都有了Advisor了,那Advice和Pointcut在哪里呢?
BeanFactoryTransactionAttributeSourceAdvisor有一个pointcut 属性,会new 一个TransactionAttributeSourcePointcut。
private final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() { @Override protected TransactionAttributeSource getTransactionAttributeSource() { return transactionAttributeSource; } };
从其继承关系,我们可以看出他其实就是一个Pointcut。
至此,就剩下Advice没有被发现。
2.TransactionAttributeSource: 其次:transactionAttributeSource()会向仓库中注册一个AnnotationTransactionAttributeSource。这个AnnotationTransactionAttributeSource干嘛用的呢?
BeanFactoryTransactionAttributeSourceAdvisor.setTransactionAttributeSource(transactionAttributeSource()) 属性值 private TransactionAttributeSource transactionAttributeSource; private final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() { @Override protected TransactionAttributeSource getTransactionAttributeSource() { return transactionAttributeSource; } }; TransactionAttributeSourcePointcut的matche方法 @Override public boolean matches(Method method, Class<?> targetClass) { if (targetClass != null && TransactionalProxy.class.isAssignableFrom(targetClass)) { return false; } TransactionAttributeSource tas = getTransactionAttributeSource(); return (tas == null || tas.getTransactionAttribute(method, targetClass) != null); }
AnnotationTransactionAttributeSource对象会赋值给BeanFactoryTransactionAttributeSourceAdvisor的transactionAttributeSource
属性。pointcut
属性初始化时,new 一个TransactionAttributeSourcePointcut类
并实现getTransactionAttributeSource()
方法,getTransactionAttributeSource()
方法正好返回了transactionAttributeSource
属性。
也就是说TransactionAttributeSourcePointcut的getTransactionAttributeSource()方法返回的是AnnotationTransactionAttributeSource
3.TransactionInterceptor : 最后:transactionInterceptor()方法,会向仓库中注册一个TransactionInterceptor类。
TransactionInterceptor从继承关系看他是一个Advice. 也就是增强器,是对事务真正处理地方。
有了Advice+Pointcut。Advice+Pointcut = Advisor 。 Advisor+TargetSource = Advised
有了Advised ,这样spring事务不正是套用了AOP的基础吗。