springboot自动装配简单来说是springboot自动的装载第三方组件的Bean 到IOC容器里面,不需要开发人员再去写Bean的配置。
springboot自动装配详细原理
在
Spring Boot
项目中的引导类上有一个注解
@SpringBootApplication
,这个注解是对三个注
解进行了封装,分别是:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
其中
@EnableAutoConfiguration
是实现自动化配置的核心注解,主要由@AutoConfigurationPackage ,
@Import(AutoConfigurationImportSelector.class)
这两个注解组成。 该注解通过 @Import
注解导入对应的配置选择器。选择配置器通过
SpringFactoriesLoader
从类路径下去读取
META-INF/spring.factories
文件信息,内部就是读取了
该项目和该项目引用的
Jar
包
的的
classpath
路径下
META-INF/spring.factories
文件
文件中的
所配
置的类的全类名。
以此全限定类名来找到这些配置类,然后根据条件注解
@ConditionalOnClass限定当前容器中没有这个类型的 Bean
的情况下,才进行
Bean
的创建和装载(这里也要用到@AutoConfigurationPackage注解帮忙)
@AutoConfigurationPackage 用于将启动类所在的包里面的所有组件注册到 spring 容器。其与@ComponentScan搭配使用,实现 Bean 的动态加载条件判断会有像 @ConditionalOnClass 这样的注解,限定当前容器中没有这个类型的 Bean 的情况下,才进行 Bean 的创建和装载
自动装配主要依靠三个核心的关键技术:
引入starter
启动依赖组件的时候,组件必须包含@Configuration配置类,配置类需要@Bean这个注解去声明需要装配到IOC容器的Bean对象
查找第三方配置类
配置类放到第三方jar包,springboot通过约定大于配置,去把这个配置类的全路径放在classpath:/META-INF/spring.factories文件里面,这样可以知道第三方的配置类的位置,上面步骤通过SpringFactoriesLoader去完成查找第三方jar包的位置。
动态加载
springboot获取第三方jar声明的配置类以后,通过ImportSelector这样一个接口,实现对配置类的动态加载,完成自动装配的动作。
总结
SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想。它的出现,让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。
其实,自动装配的思想,在 SpringFramework3.x 版本里面的@Enable 注解,就有了
实现的雏形@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解,
就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是
帮我们去自动完成这个模块相关 Bean 的注入