@zhuanxu
2017-12-07T17:02:22.000000Z
字数 1444
阅读 2201
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{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//AnnotationMetadataReadingVisitor
// 可以根据传入的 importingClassMetadata 的注释值来选择性的装载 Bean
System.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,从而我们可以进行一些设置。