Spring事务实现原理

本文详细探讨了Spring事务管理的实现原理,从@EnableTransactionManagement注解的启用开始,阐述了如何解析切面、如何进行织入,以及在运行时如何进行增强。在解析切面阶段,介绍了InfrastructureAdvisorAutoProxyCreator如何在Bean实例化前发挥作用,如何加载和初始化事务切面。接着,解释了织入过程,即在创建代理对象时,如何将事务相关顾问(如BeanFactoryTransactionAttributeSourceAdvisor)整合进去。最后,讲解了运行时增强,即TransactionInterceptor的invoke方法如何启动事务。
摘要由CSDN通过智能技术生成
Spring事务的原理是基于AOP实现的,所以流程也可以理解为与AOP一样分为3步:解析切面、织入通知和运行时增强。

1、解析切面

Srping事务的是通过@EnableTransactionManagement注解开启的,该注解往IoC容器中注入了四个对象:InfrastructureAdvisorAutoProxyCreator(类似于AnnotationAwareAspectJAutoProxyCreator,用于创建代理类的)、BeanFactoryTransactionAttributeSourceAdvisor、TransactionAttributeSource、TransactionInterceptor。
其中InfrastructureAdvisorAutoProxyCreator实现了BeanPostProcessor的接口,因此会在第一个Bean实例化之前调用applyBeanPostProcessorsBeforeInstantiation方法,里面会跑到InfrastructureAdvisorAutoProxyCreator的postProcessBeforeInstantiation方法里面:

	@Nullable
	protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
   
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
   
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
   
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
   
					return result;
				}
			}
		}
		return null;
	}

然后会调用AbstractAutoProxyCreator的postProcessBeforeInstantiation方法对切面进行初始化,其流程和AOP初始化流程一致(这里要注意事务的切面是AnnotationAwareAspectJAutoProxyCreator调用findCandidateAdvisors跑到父类AbstractAdvisorAutoProxyCreator的findCandidateAdvisors方法里面调用BeanFactoryAdvisorRetrievalHelper的findAdvisorBeans方法加载BeanFactoryTransactionAttributeSourceAdvisor缓存起来的)被切面类顺便加载

	public List<Advisor> fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值