Spring事务二:@EnableTransactionManagement

接上一篇《Spring事务一:tx 标签

在使用Spring-boot的时候,如果我们想开启事务可以在启动类上加一个注解 @EnableTransactionManagement,下面我们来分析一下内在原理,以下是注解定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement

从定义上看该注解是一个组合注解,组合注解是spring里的一大特色,被标记上该注解的类相当于也被标记上了

@Import(TransactionManagementConfigurationSelector.class)

那么核心就在这个被Import的Selector里了(以Enable开头的注解一般的编程模式就是引入若干个Selector类,从而引入需要的类);我们来看看

public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {

	/**
	 * {@inheritDoc}
	 * @return {@link ProxyTransactionManagementConfiguration} or
	 * {@code AspectJTransactionManagementConfiguration} for {@code PROXY} and
	 * {@code ASPECTJ} values of {@link EnableTransactionManagement#mode()}, respectively
	 */
	@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;
		}
	}
}

从这个类,大概看出根据注解里标注的AdviceMode返回不同的注册类,AdviceMode有Proxy代理模式和Aspectj模式,Proxy即我们常用的生成代理模式,具体实现有JDK动态代理或者Cglib动态代理;Aspectj模式需要借助Aspectj的编译器,或者采用agent进行LTW方式进行代理;

AutoProxyRegistrar

这个类作用主要有两个第一个是:如果注解标记

AdviceMode mode() default AdviceMode.PROXY; 

模式为PROXY的话,则调用

AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);方法注入代理创建者,最终调用的方法是
	public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
		return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
	}

这里是不是似曾相识,对的这里跟上一篇tx标签注入的 InfrastructureAdvisorAutoProxyCreator 类是相同的

第二个是:处理 proxyTargetClass属性,如果是true的话则会设置容器中bean定义的属性

//@A:spring内置代理创建对象的name
	public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
			"org.springframework.aop.config.internalAutoProxyCreator";

//@B:设置属性值
definition.getPropertyValues().add("proxyTargetClass", Boolean.TRUE);

ProxyTransactionManagementConfiguration

这个类主要作用是注册生成代理所需的后置处理器,也就是上一篇文章里提到的 

BeanFactoryTransactionAttributeSourceAdvisor

这里主要是通过注解配置Import的方式将所需的类加载到容器中,xml配置的方式是通过显式配置

扫描二维码关注公众号,回复: 13235155 查看本文章

猜你喜欢

转载自blog.csdn.net/Aqu415/article/details/108691660
今日推荐