Spring Boot自动配置
条件化配置
spring4开始提供了一个新注解@Conditional
,使得spring能够根据条件,决定是否要初始化某一个bean。@Conditional
注解需要传入一个实现了Condition
接口的class对象。Condition
接口也很简单,只有一个方法,返回boolean表示是否要初始化这个bean。
1
2
3
4
5
6
7
8
9
10
11
12
13class MyCondition implements Condition{
public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
//是否存在叫ENV_CN的环境变量
return env.containProperty("ENV_CN");
}
}
@Bean
@Conditional(MyCondition.class)
public ServiceBean serviceBean(){
return new ServiceBean();
}
使用@Conditional
注解需要自己去实现Condition
接口,而spring也提供了一些能直接使用的注解
1
2
3
4
5
6@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnExpression
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@ConditionalOnNotWebApplication
Spring Boot的自动配置
Spring
Boot的自动配置的自动配置正是利用了@Conditional
注解实现的。Spring
Boot的入口类使用@SpringBootApplication
注解声明,@SpringBootApplication
主要是集成了@SpringBootConfiguration
,@EnableAutoConfiguration
和@ComponentScan
三个注解。
1 |
|
其中实现自动配置的是@EnableAutoConfiguration
注解,@EnableAutoConfiguration
使用@Import
注解导入了一个名叫AutoConfigurationImportSelector
的类。与@EnableAutoConfiguration
类似,Spring
Boot还有几个Enable开头的注解,也是利用@Import
。
@EnableScheduling
是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
@EnableMBeanExport
是通过@Import将JMX相关的bean定义加载到IoC容器。
@EnableAutoConfiguration
也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
1 |
|
而AutoConfigurationImportSelector
类则会读取ClassPath下面的META-INF/spring.factories
文件。这个文件是一个key=value的配置文件,AutoConfigurationImportSelector会读取里面的org.springframework.boot.autoconfigure.EnableAutoConfiguration
的值。其值全是一些bean的配置类的全限定名。最后,这些类将使用@Conditional
或者其他注解,根据条件自动加载bean,实现Spring
Boot的自动配置。
1 |
|
参考文章: