Spring Boot自动配置

Spring Boot自动配置

条件化配置

spring4开始提供了一个新注解@Conditional,使得spring能够根据条件,决定是否要初始化某一个bean。@Conditional注解需要传入一个实现了Condition接口的class对象。Condition接口也很简单,只有一个方法,返回boolean表示是否要初始化这个bean。

1
2
3
4
5
6
7
8
9
10
11
12
13
class 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
2
3
4
5
6
7
8
9
10
11
12
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// 略
}

其中实现自动配置的是@EnableAutoConfiguration注解,@EnableAutoConfiguration使用@Import注解导入了一个名叫AutoConfigurationImportSelector的类。与@EnableAutoConfiguration类似,Spring Boot还有几个Enable开头的注解,也是利用@Import

@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。

1
2
3
4
5
6
7
8
9
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
//略
}

AutoConfigurationImportSelector类则会读取ClassPath下面的META-INF/spring.factories文件。这个文件是一个key=value的配置文件,AutoConfigurationImportSelector会读取里面的org.springframework.boot.autoconfigure.EnableAutoConfiguration的值。其值全是一些bean的配置类的全限定名。最后,这些类将使用@Conditional或者其他注解,根据条件自动加载bean,实现Spring Boot的自动配置。

1
2
3
4
5
6
7
8
9
10
11
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
......
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

参考文章:

Spring Boot的自动配置

Spring Boot 2.0 自动配置原理浅析

第5章 Spring Boot自动配置原理

Spring Boot自动配置的"魔法"是如何实现的?


Spring Boot自动配置
https://cellargalaxy.github.io/posts/框架/15.Spring Boot自动配置/
作者
cellargalaxy
发布于
2019年2月15日
许可协议