在做一些公共组件的时候,有时候希望能给自己做的组件加一个开关,通过开关控制是否把这部分功能引入进来,实现的办法有很多,这里介绍注解的方式。
在spring中有很多类似 @EnableXXX 形式的注解,这个注解的作用其实类似开关,最常用的就是 @EnableConfigurationProperties 注解了,我们看一下这个注解的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EnableConfigurationPropertiesRegistrar.class})
public @interface EnableConfigurationProperties {
String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";
Class>[] value() default {};
}
划重点,源码中有个 @Import 注解,这个注解的作用类似 @Bean 注解,作用就是把一个类作为 bean 注册到容器中。
当我们在开发公共组件的时候,定义一个@EnableXXX 注解,把这个组件中需要的 bean 通过 @Import 注解定义,由于springboot默认只扫描启动类所在目录下的 bean,所以当业务方通过maven依赖引入我们的组件时,需要在启动类上添加 @EnableXXX 来决定是否启用组件,如果不加,组件中的bean不会被注册到spring容器中,相关功能也不会生效。
如果使用了这种方式,则可以省去自动装配,不再需要 META-INF/spring.factories 或者 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
高谈阔论