Spring自动配置原理
条件注解
自动配置类中初始化Bean的方法上,使用@Conditional注解结合一个实现了Condition接口matches方法的类,来决定某个Bean是否进行初始化.一个例子如下:
@Conditional(SomeCondition.class)
@Bean
public Bean bean() {
return new Bean();
}
SomeCondition是实现了Condition接口的实现类,通过调用其matches方法,可以知道某个条件是true还是false.如果返回true,才进行bean的初始化.在SomeCondition中,什么情况返回true可以玩出非常多的花样,比如可以基于应用的某个配置信息是否存在,类路径下是否存在某个类.
Conditional注解除了可以放在@Bean,还可以放在@Component or @Configuration.
配置属性的获取
通过注解@PropertySource从指定路径读取,比如读取applicaiton.properties中的属性,启动参数的属性.
@PropertySource(value = "classpath:application.properties", ignoreResourceNotFound = true)
在Spring Boot启动时,会在许多位置获取环境变量,application.properties的属性,启动参数等配置信息.
META-INF/spring.factories
每个Spring Boot项目都依赖org.springframework.boot:spring-boot-autoconfigure这个jar文件,里面的META-INF目录下有个spring.factories文件,里面包含了大量自动配置类的声明.这些自动配置类实际上就是用了大量的@Conditional注解来判断是否某个Bean进行初始化.
高级条件注解
Spring Boot提供的Condition接口过于底层,开发人员可能需要实现这个Condition去完成一些Bean的初始化.为了使开发人员更加方便,Spring Boot提供了一些高级条件注解.比如:
@ConditionalOnMissingBean(DataSource.class) //如果容器中没有DataSource类,那么返回true
@ConditionalOnBean(DataSource.class)//如果容器中有DataSource类,那么返回true
@ConditionalOnMissingClass(DataSource.class) //如果类路径下没有DataSource类,那么返回true
@ConditionalOnProperty("my.property"). //如果声明了my.property属性,那么返回true
在大多数情况下,Spring Boot提供的注解已经可以让你不需要写Condition接口的实现.
Starter
-
SpringBoot在pom文件中依赖了很多的starter,每个starter中又依赖了很多的第三方库,通过这种方式,快速的将第三方库引入,这样才能做到自动配置.