美文网首页开源框架-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