SpringBoot自动配置原理
SpringBoot可以简化开发的一个主要原因就是采用了默认配置,所谓约定大于配置就是这个意思。在没有自己指定配置的时候使用默认配置的原理大致如下。如有错误,还请指正。
===================
2019.9.6更新,此篇博客是用的SpringBoot版本是1.5.x
===================
SpringBoot项目可以使用主类启动,就是添加了@SpringBootApplication注解的类。
进入SpringBootApplication注解可以看看到这个注解上面有添加一个@EnableAutoConfiguration注解,这个注解的作用就是开启自动配置。
进入这个类可以看到通过@Import注解导入了@Import注解注入了EnableAutoConfigurationImportSelector类,这个选择器用来导入一些组件。那么具体导入了哪些组件呢?
在父类AutoConfigurationImportSelector里有一个selectImports方法,这个方法里有一个configurations,这个configurations会被返回,在方法里调用了getCandidateConfigurations方法
这个方法返回的就是之前的configurations,而这个方法里又调用了SpringFactoriesLoader下的loadFactoryNames方法
loadFactoryNames方法会扫描META-INF/spring.factories文件
这个文件就在springboot的autoconfiguration包下
打开这个文件可以看到很多配置,这里截图其中的部分配置
通过观察这个文件可以看到很多的自动配置类,这里的每一个xxxAutoConfiguration类都是容器中的一个组件,并且都会加入到容器中,在这些自动配置类加入到容器之后自动配置才开始生效。springboot自动配置的核心就是这些自动配置类。
这里使用非常常用的DataSourceAutoConfiguration类来做例子讲解一下自动配置的流程。首先进入这个类,可以上面的几个注解。简单介绍一下这几个注解的作用。
@Configuration注解:声明此类为配置类。
@ConditionalOnClass注解:判断classpath下是否存在后面指定的类,因为我这里没有引入对应的类,所以会报红,所以这个自动配置也并没有生效。
@EnableConfigurationProperties注解:启用ConfigurationProperties功能,这个注解后面指定的类就是需要映射属性到配置文件的类。这里的配置文件是指application.properties文件
@Import注解:数据库配置相关的类,有的自动配置类时没这个注解的,比如RedisAutoConfiguration类,所以这个看具体情况,但是前面三个注解是必须的
打开DataSourceProperties类可以看到如下属性,也就是配置文件里指定数据库相关属性时的配置了。所以配置项目的之后不清楚需要指定什么配置文件的时候直接打开对应的Porperties类看一下有什么属性就可以了
那这里的默认配置容器怎么拿到呢?这就需要再回头看那个@EnableConfigurationProperties注解了,这个注解会将后面指定的DataSourceProperties.class的属性和值映射到application.properties文件中,而容器启动时会读取application配置文件的内容,这样就可以实现自动配置了。
以上是个人理解,如果有误还请大神赐教。