@zhuanxu
2017-12-07T09:02:22.000000Z
字数 1444
阅读 2451
spring-boot
Enable 启用特性看下到底是怎么做的?
先看一个Enable注解 EnableAutoConfiguration
@SuppressWarnings("deprecation")@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration {}
关键是 Import,看这个注解,可以Import的有:Configuration,ImportSelector 或者 ImportBeanDefinitionRegistrar。
public @interface Import {/*** {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}* or regular component classes to import.*/Class<?>[] value();}
我们先来看 ImportSelector:
public interface ImportSelector {String[] selectImports(AnnotationMetadata importingClassMetadata);}
需要实现 selectImports 接口,传入的是注释信息,根据注释信息有选择的返回需要注入的Bean,一个例子:
public class MyImportSelector implements ImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//AnnotationMetadataReadingVisitor// 可以根据传入的 importingClassMetadata 的注释值来选择性的装载 BeanSystem.out.println(importingClassMetadata.getAnnotationTypes());System.out.println(importingClassMetadata.getAnnotationAttributes(EnableMy.class.getName()));return new String[]{User.class.getName(),Role.class.getName()};}}
接着是ImportBeanDefinitionRegistrar
看接口
public interface ImportBeanDefinitionRegistrar {public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);}
这个与 ImportSelector 的不同是:需要我们自己注册Bean,从而我们可以进行一些设置。
