首先声明:本次spring版本5.0.7.RELEASE,Springboot版本2.0.3.RELEASE。可能大部分同学都知道事务执行的前提是为目标类生成一个代理类,那么什么时候执行呢?图1从图1可以清楚的看出//实例化所有剩余的(非lazy-init)singletons.finishBeanFactoryInitialization(beanFactory);开始执行,最后执行到AbstractAutoProxyCreator.wrapIfNecessary()方法:(bean.getClass(),beanName,null)根据bean信息;//如果顾问列表不为空if(specificInterceptors!=DO_NOT_PROXY){this.advisedBeans.put(cacheKey,Boolean.TRUE);//创建代理对象Objectproxy=createProxy(bean.getClass(),beanName,specificInterceptors,newSingletonTargetSource(bean));this.proxyTypes.put(cacheKey,proxy.getClass());返回代理;}}它的核心逻辑已经在注释中体现出来了,不再赘述~,然后执行目标bean中的所有方法Traverse,如果有匹配拦截器列表切点的方法,则执行图1中代理对象的创建。并将相应的通知器放入代理类中。以便在执行代理方法时进行拦截。图2是匹配点切割的过程。图2如何完全匹配?举个栗子:abstractclassTransactionAttributeSourcePointcutextendsStaticMethodMatcherPointcutimplementsSerializable{@Overridepublicbooleanmatches(Methodmethod,@NullableClass>targetClass){if(targetClass!=null&&TransactionalProxy.class.isAssignableFrom(targetClass);}TransactionAttributeSourcetas=getTransactionAttributeSource();//重点在这里Serializable{@Override@NullablepublicTransactionAttributeparseTransactionAnnotation(AnnotatedElementae){//获取事务注解AnnotationAttributesattributes=AnnotatedElementUtils.findMergedAnnotationAttributes(ae,交易类,假的,假的);if(attributes!=null){//解析Transactional注解配置项returnparseTransactionAnnotation(attributes);}else{返回空值;通过上面的代码块,我们可以看到返回TransactionAttribute类的实例,这样Object[]specificInterceptors=getAdvicesAndAdvisorsForBean(bean.getClass(),beanName,null);执行完毕,至此已经获取到匹配的notifier。接下来看代理对象的大致结构:图3图3中的TransactionInterceptor实例是事务提交回滚的核心;那么,什么时候实例化TransactionInterceptor呢?图4图5图6图7以上四张图可以看出springboot在创建org.springframework.transaction.config.internalTransactionAdvisor实例时会实例化TransactionInterceptor。那么问题又来了,internalTransactionAdvisor是什么时候实例化的呢?答案是在实例化objectMapperConfigurer的时候。//1。Registerbeanprocessorsthatinterceptbeancreation.registerBeanPostProcessors(beanFactory);//2.PostProcessorRegistrationDelegate类publicstaticvoidregisterBeanPostProcessors(ConfigurableListableBeanFactorybeanFactory,AbstractApplicationContextapplicationContext){//获取BeanPostProcessor类型的Bean处理器包含objectMapperConfigurerString[]postProcessorNames=beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);for(StringppName:postProcessorNames){if(!processedBeans.contains(ppName)){currentRegistryProcessors.add(//实例化objectMapperConfigurerbeanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);重申=真;}}}
