回顾下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
。
AbstractAutoProxyCreator
在AOP实现原理中做了大部分工作。
从这一点看,事务代理对象创建过程,与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;
}
}