一丶什么是 SpringBoot 自动装配
SpringBoot 通过 SPI 的机制,在我们程序员引入一些 starter 之后,扫描外部引用 jar 包中的 META-INF/spring.factories
文件,将文件中配置的类型信息加载到 Spring 容器,实现引入 starter 即可开启相关功能的操作,大大简化了程序员手动配置 bean,即开即用。
二丶 SpringBoot 自动装配源码解析
1.源码解析入口
SpringApplication.run(启动类.class, args)
复制代码
这是我们最常用的 Main 方法启动 SpringBoot 服务的方式,其中启动类上需要标注 @SpringBootApplication
注解,自动装配,扫描主类下所有 Bean 的奥秘就在此
2.@SpringBootApplication 注解
@SpringBootApplication
本身没有什么神奇的地方,重要的是注解上面标注了 @SpringBootConfiguration
, @EnableAutoConfiguration
,和 @ComponentScan
注解
-
@SpringBootConfiguration
平平无奇,上面标注了@Configuration
表示标注的类是一个配置类 -
@EnableAutoConfiguration
表示开启自动配置,即我们说的 SpringBoot 自动装配、
-
@AutoConfigurationPackage
其上方标注了@Import(AutoConfigurationPackages.Registrar.class)
,加上@EnableAutoConfiguration
上的@Import(AutoConfigurationImportSelector.class)
.@Import
注解的作用是导入一些 bean 到 Spring 容器中,实现此功能的是ConfigurationClassPostProcessor
,它是一个BeanFactoryPostProcessor
会解析配置类中的 @Bean,@Import,@ComponentScan 等注解
-
@ComponentScan
,指导 Spring 容器需要扫描哪些包下的类加入到 Spring 容器
也就是说 @SpringBootApplication
相当于
3.自动配置源码学习前言
SpringBoot 并不是 Spring 的替代品,而是利用 Spring 加上 约定大于配置
的思想,方便程序员开发的框架。所以其底层还是 Spring 那一套
本篇着重研究 SpringBoot 的自动装配原理,所以一些无关的代码不会进行详细探究,后续会单独学习整理。
4.SpringApplication#run 是如何初始化 ApplicationContext 的
既然 SpringBoot 是基于 Spring 的,那么必然是无法脱离 ApplicationContext 的,接下来我们以 SpringApplication#run
为入口看看,SpringApplication 是如何初始化一个 ApplicationContext 的
4.1 SpringApplication 的初始化
我们在启动类的 main 方法中 SpringApplication.run(启动类.class, args)
其实最终调用的是
在其构造方法中:
-
根据当前项目判断 Web 应用类型
-
初始化
ApplicationContextInitializer