美文网首页开源框架-SpringBoot系列
SpringBoot自动配置 - @Enable* & @Imp

SpringBoot自动配置 - @Enable* & @Imp

作者: 鱼da王 | 来源:发表于2019-11-06 15:50 被阅读0次

    @Enable*

    1. 功能:开启某方面的支持

    2. 例子:

      • @EnableScheduling 开启计划任务的支持

      • @EnableAsync 开启异步方法的支持

      • @EnableAspectJAutoProxy 开启对 AspectJ 代理的支持

      • @EnableTransactionManagement 开启对事务的支持

      • @EnableCaching 开启对注解式缓存的支持

        ...

    3. 实际作用:所有@Enable* 注解都是有@Import的组合注解,@Enable* 自动开启的实现其实就是导入了一些自动配置的Bean

    @Import 注解的用法

    1. 直接导入配置类(@Configuration 类)

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Import(SchedulingConfiguration.class)
      @Documented
      public @interface EnableScheduling {
      }
    
    @Configuration
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public class SchedulingConfiguration {
     @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
     @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
     public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
         return new ScheduledAnnotationBeanPostProcessor();
     }
    
    }
    
    1. 依据条件选择配置类(实现 ImportSelector 接口)

      作用:配置类不确定,需根据@Import注解所标识的类或另一个注解(通常是注解)里的定义信息选择配置类

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Import(AsyncConfigurationSelector.class)
      public @interface EnableAsync {
      
       Class<? extends Annotation> annotation() default Annotation.class;
       
       boolean proxyTargetClass() default false;
      
       AdviceMode mode() default AdviceMode.PROXY;
      
       int order() default Ordered.LOWEST_PRECEDENCE;
      
      }
      
      public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {
      
       private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
               "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
      
       @Override
       @Nullable
       public String[] selectImports(AdviceMode adviceMode) {
           switch (adviceMode) {
               case PROXY:
                   return new String[] {ProxyAsyncConfiguration.class.getName()};
               case ASPECTJ:
                   return new String[] {ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};
               default:
                   return null;
           }
       }
      }
      
    2. 动态注册Bean(实现 ImportBeanDefinitionRegistrar 接口)

      如果注入的bean不是确定类或者不是spring专用的(一般确切知道注入某个类的话,可以用@Component,@Service,@Repository,@Bean等),并不想用spring的注解进行侵入式标识,那么就可以通过@Import注解,实现ImportBeanDefinitionRegistrar接口来动态注册Bean

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Import(AspectJAutoProxyRegistrar.class)
      public @interface EnableAspectJAutoProxy {
      
       boolean proxyTargetClass() default false;
       
       boolean exposeProxy() default false;
      
      }
      

      关键点在于 AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口。ImportBeanDefinitionRegistrar的作用是在运行时自动添加Bean到已有的配置类。

      例子:Mybatis 中大名鼎鼎的@MapperScan

    @Role注解

    1. 标识Bean的类别
    2. 种类:
      1. ROLE_APPLICATION = 0
        • bean的默认角色
        • 标识应用的主要的主要角色
        • 通常对应于用户定义的bean
      2. ROLE_SUPPORT = 1
        • 标识较大配置的一部分
        • 通常是仔细观察特定的ComponentDefinition时重要的提示,而不是体现在应用中
      3. ROLE_INFRASTRUCTURE = 2
        • 标识后台角色,与最终用户无关
        • 通常供是内部工作的bean使用
    3. 作用 : 目前不晓得

    相关文章

      网友评论

        本文标题:SpringBoot自动配置 - @Enable* & @Imp

        本文链接:https://www.haomeiwen.com/subject/myiubctx.html