SpringBoot之自动配置原理


SpringBoot之自动配置原理

1.分析

创建SpringBoot项目时,都会默认创建一个Application启动类,并且标注着@SpringBootApplication注解。深入探究会发现@SpringBootApplication注解除了自定义注解经常出现的元注解外,主要还有三个注解标注:@SpringBootConfiguration@ComponentScan@EnableAutoConfiguration,这三个注解可以说就是入口前的三把钥匙了,但是钥匙只有一把,所以我们不妨跟着其中的注释一一整理一番

SpringBootApplication

@SpringBootConfiguration:再进入一层会发现就是我们配置类常用注解@Configuration,目的是使用JavaConfig的配置方式来代替XML的繁琐配置

@ComponentScan:扫描注解,默认是扫描当前类下的package。将Spring一些例如@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。(备注:@EnableAutoConfiguration中的@AutoConfigurationPackage则是用来扫描一些其他组件注解的,比如Spring Data Jpa中的@Entity注解等)

@EnableAutoConfiguration:自动配置核心注解,下文详细分析

2.@EnableAutoConfiguration实现自动配置

我们通过代码一步步抽丝剥茧

2.1 EnableAutoConfiguration注解

EnableAutoConfiguration

排除元注解和前面我们解释过的@AutoConfigurationPackage注解,可以看出,重点在于@Import(AutoConfigurationImportSelector.class)上。

2.2 自动配置链路分析

AutoConfigurationImportSelector.selectImports

getAutoConfigurationEntry

getCandidateConfigurations

SpringFactoriesLoader.loadFactoryNames

/spring.factories.path

spring.factories.content

从上图和备注我们大致就可以理清自动配置的思路了,通过自动装配导入选择器AutoConfigurationImportSelector.class来获取候选的一些自动配置项列表,这些自动配置项(127项)都以key为EnableAutoConfiguration统一存储在spring-boot-autoconfigure-x.x.x.x.jar的META-INF/spring.fatocies中

2.3 配置自动装配加载

当然这些配置并不是全部127项都加载进去,而是按需分配,开发人员可以通过@SpringBootApplicationexclude属性来排除指定的配置项,再根据默认配置的getConfigurationClassFilter()方法获取到的过滤器过滤掉了,最后剩下23个默认配置项

scanBasePackages:扫描注解,默认是扫描当前类下的package。将Spring一些例如@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。
exclude:排除特定的自动配置类

3.总结

  • 自动配置的核心是@EnableAutoConfiguration,SpringBoot在启动时会用SPI机制来加载spring.factories中的自动配置项,然后根据开发者的配置和默认配置筛选保留对应的配置进行加载。
  • 自动配置功能保证了SpringBoot开箱即用的特点,省心省事

【参考链接】:
1:面试高频题:springboot自动装配的原理你能说出来吗?
2:SpringBoot自动配置原理


评论
  目录