Spring Boot 的自动装配是在他的核心注解 @SpringBootApplication 实现的,@SpringBootApplication 大概可以看成@Configuration@EnableAutoConfiguration@ComponentScan 注解的集合。其中@EnableAutoConfiguration 就算启用 Spring Boot 的自动装配机制,@EnableAutoConfiguration 通过 @Import 导入了 AutoConfigurationImportSelector 这个类,AutoConfigurationImportSelector 类中的 getCandidateConfiguration 方法会将所有自动配置类的信息以 List 的形式返回,并交由 Spring 容器做 bean 来管理。最后,通过@Conditional等条件注解按需加载的配置类,其他的将被过滤掉。

参考 SpringBoot 的启动过程:

当启动 Spring Boot 应用程序的时候,会先创建 SpringApplication 的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个过程中会加载整个应用程序中的 spring.factories 文件,将文件的内容放到缓存对象中,方便后续获取。SpringApplication 对象创建完成之后,开始执行run方法,来完成整个启动,启动过程中最主要的有两个方法,第一个叫做 prepareContext,第二个叫做 refreshContext,在这两个关键步骤中完整了自动装配的核心功能,前面的处理逻辑包含了上下文对象的创建,banner的打印,异常报告期的准备等各个准备工作,方便后续来进行调用。

在 prepareContext 方法中主要完成的是对上下文对象的初始化操作,包括了属性值的设置,比如环境对象,在整个过程中有一个非常重要的方法,叫做load,load主要完战一件事,将当前启动类做为一个 beanDefinition 注册到registry中,方便后续在进行 BeanFactoryPostProcessor 调用执行的时候,找到对应的主类,来完成 @SpringBootApplicaiton,@EnableAutoConfiguration等注解的解析工作。

在 refreshContext 方法中会进行整个容器刷新过程,会调用中spring中的refresh方法,refresh中有13个非常关键的方法,来完成整个spring应用程序的启动,在自动装配过程中,会调用 invokeBeanFactoryPostProcessor 方法,在此方法中主要是对ConfigurationClassPostProcessor类的处理,这次是BFPP的子类也是BDRPP的子类,在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry方法,然后调用postProcessBeanFactory方法,在执行postProcesskeanDefinitionRegistry的时候回解析处理各种注解,包含@PropertySource,@ComponentScan,@ComponentScans,@Bean,@lmport等注解,最主要的是import注解的解析。

在解析@lmport注解的时候,会有一个getlmports的方法,从主类开始递归解析注解,把所有包含@lmport的注解都解析到,然后在processlmport方法中对Import的类进行分类,此处主要识别的时候AutoConfigurationlmportSelect归属于ImportSelect的子类,在后续过程中会调用deferredlmportSelectorHandler中的process方法,来完整EnableAutoConfiguration的加载。

通过@Conditional等条件注解按需加载的配置类,其他的将被过滤掉