springboot Enablexxx功能实现
- Enable* 实现原理
- 举个栗子
Enable* 实现原理
EnableAutoConfiguration 注解类实现类似,都是添加注解,在其上面实现@import注解。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
**Import(EnableAutoConfigurationImportSelector.class)**
public @interface EnableAutoConfiguration {
........
}
添加@EnableAutoConfiguration 时候就会自动import EnableAutoConfigurationImportSelector类,其实现了
ImportSelector 接口,返回String[] 类列表,自动注入到spring Bean 工厂中。其注入到Bean
工厂中的类在spring-boot-autoconfiguration 配置包Spring.factories中。
autoconfiguration 自动注解的功能在下一节在继续讲解。
举个栗子
- 添加需要注解的类
public class Market {
}
public class Sales {
}
- 添加importSelector导入类
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println(importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()).toString().contains("onlySale"));
//获取自定的@EnableLogInfo 信息 如果包含 onlySale 则只注入Sales class 否则 注入 Sales 和 Market 两个类
if (importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()) != null
&& importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()).toString().contains("onlySale"))
{
return new String[]{Sales.class.getName()};
}
return new String[]{Market.class.getName(), Sales.class.getName()};
}
}
- 添加Enable*注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MyImportSelector.class)
public @interface EnableLogInfo {
String[] name();
}
- 使用
场景一个常规的springboot工程,不会的可以google。
@RestController
@SpringBootApplication
@EnableLogInfo(name = "onlySale")
public class SpringbootHelloApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringbootHelloApplication.class, args);
System.out.println(context.getBean(MyImportSelector.class));
System.out.println(context.getBean(Market.class));
System.out.println(context.getBean(Sales.class));
}
}
2018-04-07 16:42:31.163 INFO 28160 --- [ main] c.y.s.hello.SpringbootHelloApplication : Started SpringbootHelloApplication in 3.561 seconds (JVM running for 4.135)
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.yang.springboot.hello.enable.demo.MyImportSelector' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1092)
at com.yang.springboot.hello.SpringbootHelloApplication.main(SpringbootHelloApplication.java:46)