SpringBoot2 自动配置入门
自动包规则原理:
@SpringBootApplication是一个融合注解,相当于:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration就是声明这是一个配置类,@ComponentScan声明SpringBoot去哪里扫描组件,把符合条件的带有Spring注解的类加载到容器
里,默认是启动类所在包下。
重点看:@EnableAutoConfiguration
它其实相当于:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage又相当于:
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
@AutoConfigurationPackage的作用是利用registrar把主启动类所在的包注册为“自动配置默认包”,即 Spring Boot 自动配置时参考的“项目根包”。
这个包信息后面会被一些自动配置使用,比如:
JPA 扫描 @Entity
Spring Data 扫描 Repository
某些框架定位默认业务包
然后导入的AutoConfigurationImportSelector类会去找所有自动配置候选类,Spring Boot 启动时会读取这些类,根据条件判断是否导入。
我们可以跟进一下源码:






可以看到AutoConfigurationImportSelector类就是从META-INF/spring.factories文件加载自动配置候选类的,记录了一启动就要加载的所有配置类
然后这些类会有conditional注解,再据此筛选配置类。如果用户自己写了配置类则以用户的优先。
总结:
- SpringBoot 先加载所有的自动配置类
xxxxxAutoConfiguration。 - 每个自动配置类按照条件生效,默认都会绑定配置文件指定的值,从
xxxxProperties里面拿。xxxProperties和配置文件进行了绑定。 - 生效的配置类就会给容器中装配很多组件。
- 只要容器中有这些组件,相当于这些功能就有了。
- 定制化配置:
- 用户直接自己通过
@Bean替换底层的组件。 - 用户查看这个组件获取的是配置文件中的什么值,再去修改。
- 用户直接自己通过