[关闭]
@zhuanxu 2017-12-07T09:02:22.000000Z 字数 1444 阅读 889

Spring boot Enable 注解

spring-boot


Enable 启用特性看下到底是怎么做的?

先看一个Enable注解 EnableAutoConfiguration

  1. @SuppressWarnings("deprecation")
  2. @Target(ElementType.TYPE)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. @Inherited
  6. @AutoConfigurationPackage
  7. @Import(EnableAutoConfigurationImportSelector.class)
  8. public @interface EnableAutoConfiguration {
  9. }

关键是 Import,看这个注解,可以Import的有:ConfigurationImportSelector 或者 ImportBeanDefinitionRegistrar

  1. public @interface Import {
  2. /**
  3. * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
  4. * or regular component classes to import.
  5. */
  6. Class<?>[] value();
  7. }

selectImports

我们先来看 ImportSelector

  1. public interface ImportSelector {
  2. String[] selectImports(AnnotationMetadata importingClassMetadata);
  3. }

需要实现 selectImports 接口,传入的是注释信息,根据注释信息有选择的返回需要注入的Bean,一个例子:

  1. public class MyImportSelector implements ImportSelector{
  2. @Override
  3. public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  4. //AnnotationMetadataReadingVisitor
  5. // 可以根据传入的 importingClassMetadata 的注释值来选择性的装载 Bean
  6. System.out.println(importingClassMetadata.getAnnotationTypes());
  7. System.out.println(importingClassMetadata.getAnnotationAttributes(EnableMy.class.getName()));
  8. return new String[]{User.class.getName(),Role.class.getName()};
  9. }
  10. }

接着是ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar

看接口

  1. public interface ImportBeanDefinitionRegistrar {
  2. public void registerBeanDefinitions(
  3. AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
  4. }

这个与 ImportSelector 的不同是:需要我们自己注册Bean,从而我们可以进行一些设置。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注