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认为是需要调用的增强,最终会包装进代理类中。从而真实类实例化结束后,返回一个代理实例。
具体执行过程暂时不分析了。