1、讲Spring事务前先讲一下Aop,因为Spring事务就是Aop的 运用:
Aop是啥?面向切面编程,我看到这个词,反正一脸蒙蔽。我就用实际情况来说Aop吧,Aop就是对一个类中的方法进行增强
如何实现增强呢?我生成一个代理类,这个代理类中包含了被代理的方法,再写上想要增强的内容方法,那么我在操作代理类
其实就可以达到增强的效果,所以归根结底就是我要生成一个带有增强属性或方法的代理类,这个过程我们就简单理解为Aop。
2、下面我就不啰嗦了:
开启Aop 看 @EnableAspectJAutoProxy 会注册进来一个类 AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAwareAspectJAutoProxyCreator.class 这个类很关键。
3、开启事务 看 @EnableTransactionManagement
@Override
protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
return new String[] {AutoProxyRegistrar.class.getName(),
ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[] {determineTransactionAspectClass()};
default:
return null;
}
}
这个注解最终会将上面数组中的类变成beandefination ,最后也是会实例化。
4、ProxyTransactionManagementConfiguration.class 这个类
@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
advisor.setTransactionAttributeSource(transactionAttributeSource());
//设置通知类
advisor.setAdvice(transactionInterceptor());
if (this.enableTx != null) {
advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
}
return advisor;
}
创建事务切面,此bean的类型是关键,可以看到最终是实现了advisor。
5、结合上一篇文章知道,实现aop其中一个方法就是实现advisor 接口,所以在每一个bean实例化的最后,
if (mbd == null || !mbd.isSynthetic()) {
//这个地方可能生出代理实例,是aop的入口
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
这个方法中会拿到合格的切面,然后挨个和当前bean进行匹配,所谓匹配就是使用收集的advisor中的pointcut对象进行match调用
如果符合就会把当前advisor认为是需要调用的增强,最终会包装进代理类中。从而真实类实例化结束后,返回一个代理实例。
具体执行过程暂时不分析了。