2024-12-18  阅读(78)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/9628697692

回答

在 Spring 中,@Enable* 注解的作用是开启某种特定功能,以便简化开发配置流程。简单点来说就是@Enable* 是一个开关,通过它我们可以非常方便的开启某种功能,例如 AOP、事务、异步处理等等。比如:

  • @EnableScheduling:开启任务调度。
  • @EnableAsync:开启异步方法支持。
  • @EnableTransactionManagement:开启事务管理。

@Enable* 背后的核心是组合式注解和扩展机制,它主要是通过 @Import 加载配置类或 ImportSelectorImportBeanDefinitionRegistrar 动态注册相关 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);
  }

}