回答
在 Spring 中,@Enable*
注解的作用是开启某种特定功能,以便简化开发配置流程。简单点来说就是@Enable*
是一个开关,通过它我们可以非常方便的开启某种功能,例如 AOP、事务、异步处理等等。比如:
@EnableScheduling
:开启任务调度。@EnableAsync
:开启异步方法支持。@EnableTransactionManagement
:开启事务管理。
@Enable*
背后的核心是组合式注解和扩展机制,它主要是通过 @Import
加载配置类或 ImportSelector
、ImportBeanDefinitionRegistrar
动态注册相关 Bean。
详解
我们已 EnableTransactionManagement
为例来讲解下 @Enable*
相关的原理。关于 @Import
相关的内容详见面试题:知道 Spring 中@lmport 注解的作用吗?
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default Ordered.LOWEST_PRECEDENCE;
}
继续进入 @Import
内部:
public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<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;
}
}
private String determineTransactionAspectClass() {
return (ClassUtils.isPresent("javax.transaction.Transactional", getClass().getClassLoader()) ?
TransactionManagementConfigUtils.JTA_TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME :
TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME);
}
}