接上一篇《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配置的方式是通过显式配置