Springboot自动配置原理


Springboot自动配置原理

条件注解

自动配置类中初始化Bean的方法上,使用@Conditional注解结合一个实现了Condition接口matches方法的类,来决定某个Bean是否进行实例化.一个例子如下:

1
2
3
4
5
@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中的属性,启动参数的属性.

1
@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提供了一些高级条件注解.比如:

1
2
3
4
@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中又依赖了很多的第三方库,通过这种方式,快速的将第三方库引入,这样才能做到自动配置.

参考资料

https://www.marcobehler.com/guides/spring-boot-autoconfiguration#_autoconfigurations


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!