SpringBoot自动配置原理
点击进去@SpringBootApplication注解中看看,可以发现有三个注解是比较重要的
- @SpringBootConfiguration:我们点进去以后可以发现底层是Configuration注解,说明启动类就是一个配置类
- @EnableAutoConfiguration:开启自动配置功能(重要)
- @ComponentScan:这个注解,学过Spring的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。
EnableAutoConfiguration
“约定大于配置"就是由这个注解完成的,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
@AutoConfigurationPackage:自动配置包
@Import:给IOC容器导入组件
AutoConfigurationPackage
点进去看
再点开AutoConfigurationPackages.Registrar.class
发现这个重要方法
在默认的情况下就是将:主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。
- 看完这句话,会不会觉得,这不就是ComponentScan的功能吗?这俩不就重复了吗?
比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由@AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/@Service/@Component/@Repository这些注解是由ComponentScan来扫描并加载的。
简单理解:这二者扫描的对象是不一样的。
@Import(AutoConfigurationImportSelector.class)
点开getCandidateConfigurations方法(得到候选配置)
这里包装了一层,我们看到的只是通过SpringFactoriesLoader来加载,还没看到关键信息,继续进去
简单梳理:
- FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories
- Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象(属性对象)
- 从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。
@SpringBootApplication等同于下面三个注解:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!