SpringBoot可以简化开发的一个主要原因就是采用了默认配置,所谓约定大于配置就是这个意思。在没有自己指定配置的时候使用默认配置的原理大致如下

本次使用的Springboot版本为:spring-boot-autoconfigure-2.1.1.RELEASE.jar

  • SpringBoot项目可以使用主类启动,就是添加了@SpringBootApplication注解的类。



spring boot bean扫描源码 springboot配置扫描_jar


  • 进入SpringBootApplication注解可以看看到这个注解上面有添加一个@EnableAutoConfiguration注解,这个注解的作用就是开启自动配置。


spring boot bean扫描源码 springboot配置扫描_配置文件_02


  • 进入这个类可以看到通过@Import注解导入了@Import注解注入了EnableAutoConfigurationImportSelector类,这个选择器用来导入一些组件。那么具体导入了哪些组件呢?


spring boot bean扫描源码 springboot配置扫描_配置文件_03


  • 进入AutoConfigurationImportSelector里有一个selectImports方法


spring boot bean扫描源码 springboot配置扫描_配置文件_04


  • 下一步


spring boot bean扫描源码 springboot配置扫描_spring_05


  • 下一步


spring boot bean扫描源码 springboot配置扫描_spring_06


  • 下一步


spring boot bean扫描源码 springboot配置扫描_spring_07


  • 下一步


spring boot bean扫描源码 springboot配置扫描_jar_08


  • 下一步 loadSpringFactories方法会扫描META-INF/spring.factories文件


spring boot bean扫描源码 springboot配置扫描_spring_09


  • 下一步 配置文件就在spring-boot-autoconfigure-2.1.1.RELEASE.jar


spring boot bean扫描源码 springboot配置扫描_jar_10


在spring.factories文件中 打开这个文件可以看到很多配置,这里截图其中的部分配置


spring boot bean扫描源码 springboot配置扫描_配置文件_11


通过观察这个文件可以看到很多的自动配置类,这里的每一个xxxAutoConfiguration类都是容器中的一个组件,并且都会加入到容器中,在这些自动配置类加入到容器之后自动配置才开始生效。springboot自动配置的核心就是这些自动配置类。

这里使用非常常用的DataSourceAutoConfiguration类来做例子讲解一下自动配置的流程。首先进入这个类,可以上面的几个注解。简单介绍一下这几个注解的作用。

@Configuration注解:声明此类为配置类。

@ConditionalOnClass注解:判断classpath下是否存在后面指定的类,因为我这里没有引入对应的类,所以会报红,所以这个自动配置也并没有生效。

@EnableConfigurationProperties注解:启用ConfigurationProperties功能,这个注解后面指定的类就是需要映射属性到配置文件的类。这里的配置文件是指application.properties文件

@Import注解:数据库配置相关的类,有的自动配置类时没这个注解的,比如RedisAutoConfiguration类,所以这个看具体情况,但是前面三个注解是必须的


spring boot bean扫描源码 springboot配置扫描_jar_12


打开DataSourceProperties类可以看到如下属性,也就是配置文件里指定数据库相关属性时的配置了。所以配置项目的之后不清楚需要指定什么配置文件的时候直接打开对应的Porperties类看一下有什么属性就可以了


spring boot bean扫描源码 springboot配置扫描_spring_13


那这里的默认配置容器怎么拿到呢?这就需要再回头看那个@EnableConfigurationProperties注解了,这个注解会将后面指定的DataSourceProperties.class的属性和值映射到application.properties文件中,而容器启动时会读取application配置文件的内容,这样就可以实现自动配置了。