0.前提: 项目代码

 

 

 1.项目启动时加载SpringBoot的主配置类SpringBootxxApplication,此类在底层加载了很多springboot带有的bean对象到容器中.具体过程解释如下:

因为此类上配置了@SpringBootApplication注解, 这个注解是一个复合注解或者派生注解

而此注解类上又配置了自动装配功能 @SpringBootConfiguration和@EnableAutoConfiguration

(@EnableAutoConfiguration注解借助@SpringBootApplication被间接的标记在了Spring Boot的启动类SpringBootxxApplication上)

 @EnableAutoConfiguration注解的也是一个派生注解. 其中的关键功能由@import 提供其导入的AutoConfigurationImportSelector的selectImports()方法通过来给spring完成自动配置(当运行SpringBoot的启动类时,会运行 SpringApplication.run().在run运行时,这些注解就会生效,就会执行selectImports方法,selectImports方法通过SpringFactoriesLoader.loadFactoryNames()扫描项目的类库中每个jar包,看其是否有META-INF/spring.factories文件.  此文件的内容是一个key多个value<每个value用逗号分隔>. 如果有这样的文件就加载此文件配置的所有类, 并将它们读取到内存, 它们大多数形成实例对象都是需要条件的,如果它们形成了实例对象就把实例对象纳入到spring容器中管理)。

 

 

 

底下是AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()源码调用次序.

 

 

比如:  spring-boot-autoconfigure-2.3.0.RELEASE.jar里就有一个这样的spring.factories文件。

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:

 

 

 注意: 上边的spring.factories文件内的value中的值每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的.

这些条件在每个XxxxAutoConfiguration类上以注解的形式体现, 常见的条件注解有如下几项:

 

 

注: 以XxxxAutoConfiguration形式在触发条件时导入一些配置类对象被称作JavaConfig形式.

以ServletWebServerFactoryAutoConfiguration类为例,解释一下全局配置文件中的属性值(比如:server.port=8081)如何生效,(当然不配置也会有默认值,这个默认值来自于org.apache.catalina.startup.Tomcat)。

本类上,有一个@EnableConfigurationProperties注解:作用是开启配置属性,而它后面的参数是一个ServerProperties类,这就是配置的最终落地点。(@EnableConfigurationProperties注解负责将有属性值的ServerProperties对象导入到spring容器中)

 而ServerProperties注解用@ConfigurationProperties. 它的作用是从配置文件中读取属性值绑定到对应的bean对象上

而@EnableConfigurationProperties负责导入这个已经绑定了属性值的bean到spring容器中(ServerProperties类与配置文件中以prefix开头的一组键值对是一一对应的)

再次精简解释@ConfigurationProperties和@EnableConfigurationProperties:在全局配置文件中的属性值如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties(例如ServerProperties)一个bean对象上,然后再通过@EnableConfigurationProperties注解将bean对象导入到Spring容器中(在容器中的ServerProperties对象内拥有属性值, 这些数据可以供项目来使用)。

 

 

 但面试的时候,其实远远不需要回答的这么具体,对于上边这么长的一大段解释只需要这样精简的回答:

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类的名字都是以AutoConfiguration结尾的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性值如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

用图片的形式解释上边精简的总结

 

2.这些XxxxAutoConfiguration类的作用就是自动扫描启动类所在包及其子包中的类,并加载到内存

3.然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service 等)

4.假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例.

(假如此Bean指定了生命周期方法,还会调用生命周期方法<@PostConstruct, @PreDestroy等>)

5.当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。