SpringBoot之自动配置原理
1.分析
创建SpringBoot项目时,都会默认创建一个Application启动类,并且标注着@SpringBootApplication
注解。深入探究会发现@SpringBootApplication
注解除了自定义注解经常出现的元注解外,主要还有三个注解标注:@SpringBootConfiguration
、@ComponentScan
、@EnableAutoConfiguration
,这三个注解可以说就是入口前的三把钥匙了,但是钥匙只有一把,所以我们不妨跟着其中的注释一一整理一番
@SpringBootConfiguration
:再进入一层会发现就是我们配置类常用注解@Configuration
,目的是使用JavaConfig的配置方式来代替XML的繁琐配置
@ComponentScan
:扫描注解,默认是扫描当前类下的package。将Spring一些例如@Controller
/@Service
/@Component
/@Repository
等注解加载到IOC容器中。(备注:@EnableAutoConfiguration
中的@AutoConfigurationPackage
则是用来扫描一些其他组件注解的,比如Spring Data Jpa中的@Entity
注解等)
@EnableAutoConfiguration
:自动配置核心注解,下文详细分析
2.@EnableAutoConfiguration
实现自动配置
我们通过代码一步步抽丝剥茧
2.1 EnableAutoConfiguration注解
排除元注解和前面我们解释过的
@AutoConfigurationPackage
注解,可以看出,重点在于@Import(AutoConfigurationImportSelector.class)
上。
2.2 自动配置链路分析
从上图和备注我们大致就可以理清自动配置的思路了,通过自动装配导入选择器AutoConfigurationImportSelector.class
来获取候选的一些自动配置项列表,这些自动配置项(127项)都以key为EnableAutoConfiguration统一存储在spring-boot-autoconfigure-x.x.x.x.jar的META-INF/spring.fatocies中。
2.3 配置自动装配加载
当然这些配置并不是全部127项都加载进去,而是按需分配,开发人员可以通过@SpringBootApplication
的exclude属性来排除指定的配置项,再根据默认配置的getConfigurationClassFilter()
方法获取到的过滤器过滤掉了,最后剩下23个默认配置项
scanBasePackages
:扫描注解,默认是扫描当前类下的package。将Spring一些例如@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。exclude
:排除特定的自动配置类
3.总结
- 自动配置的核心是
@EnableAutoConfiguration
,SpringBoot在启动时会用SPI机制来加载spring.factories中的自动配置项,然后根据开发者的配置和默认配置筛选保留对应的配置进行加载。 - 自动配置功能保证了SpringBoot开箱即用的特点,省心省事