(1)首先查看启动类,类上有一个@SpringBootApplication注解。

简述spring boot自动配置 springboot中的自动配置_spring


该注解标注在某个类上,说明该类为 SpringBoot的主配置类;运行这个类的main()方法来启动该Spring Boot的应用。

(2)点开@SpringBootApplication注解,我们能够发现,其实它是一个组合注解 。下面我们重要看注解 @SpringBootConfiguration@EnableAutoConfiguration

简述spring boot自动配置 springboot中的自动配置_spring_02


@SpringBootConfiguration注解

下面看一下@SpringBootConfiguration注解:

简述spring boot自动配置 springboot中的自动配置_加载_03


表明该类是一个Spring的配置类。

下面看一下@Configuration注解:

简述spring boot自动配置 springboot中的自动配置_spring_04


表明Spring的配置类也是Spring的一个组件。@EnableAutoConfiguration注解

@EnableAutoConfiguration注解是开启自动配置的功能的。

简述spring boot自动配置 springboot中的自动配置_选择器_05


先看一下@AutoConfigurationPackage这个注解:

简述spring boot自动配置 springboot中的自动配置_spring_06


注:这个注解是自动配置包,使用的是@Import来给Spring容器中导入一个组件 ,这里导入的是AutoConfigurationPackages.Registrar.class。继续看AutoConfigurationPackages.Registrar.class

简述spring boot自动配置 springboot中的自动配置_spring_07


注:通过这个方法来获取扫描的包路径。

我们在该代码处,打个断点,debug项目,看一下获取到的包路径:

简述spring boot自动配置 springboot中的自动配置_加载_08


再来计算一下metadata的值:

简述spring boot自动配置 springboot中的自动配置_选择器_09


这个也就是@SpringBootApplication注解上的Springboot01HelloworldApplication类,也就是主配置类。

注:就是将主配置类——@SpringBootApplication标注的类的所在包以及子包里面所有组件扫描加载到Spring容器中。


经过上面的分析,知道并获取了包扫描的路径,下面看一下具体加载的组件。

@Import(AutoConfigurationImportSelector.class)注解

这个注解就是给Spring容器导入组件,

@Import注解就是给Spring容器中导入一些组件;AutoConfigurationImportSelector.class:是组件的选择器。

简述spring boot自动配置 springboot中的自动配置_选择器_10


AutoConfigurationImportSelector类中有个selectImports方法,该方法是将所有需要导入的组件以全类名的方式返回。——因此这些组件就会添加到容器中了。

类似的,在代码处打个断点,debug

下面分析具体怎样获取这些配置类的:

简述spring boot自动配置 springboot中的自动配置_加载_11


简述spring boot自动配置 springboot中的自动配置_加载_12


最后从META-INF/spring.factories中获得资源,然后通过Properties来进行加载资源。

简述spring boot自动配置 springboot中的自动配置_spring_13


简述spring boot自动配置 springboot中的自动配置_选择器_14


spring-boot-autoconfigure包下META-INF/spring.factories:

简述spring boot自动配置 springboot中的自动配置_简述spring boot自动配置_15


简述spring boot自动配置 springboot中的自动配置_spring_16


注:SpringBoot就会把这些自动配置类加到容器中。