你来说⼀下springboot的启动时的⼀个⾃动装配过程吧
前⾔
没有⾯试就继续夯实⾃⼰的基础,前阵⼦的在⾯试过程中遇到的各种问题陆陆续续都会总结出来分享给⼤家,这次要说的也是⾯试中被问到的⼀个⾼频的问题,我当时其实没答好,因为很早之前是看到springboot的启动的⼀个过程的源码的,但是时间隔得有点久了(两年多没⽤过springboot),所以当时也没答好。这次好好总结这部分知识。
SpringApplication.run()
四六级准考证号忘了怎么查询
我看⽹上好多介绍springboot⾃动装配过的⽂章时,上来就直接说@SpringBootApplication 注解是⼀个复合注解,从这个注解开始介绍springboot是如何将配置项进⾏加载的。其实我觉得难道不应该是先启动了spring的容器,然后才能扫到注解,然后才能解析注解吗?也可能是⼤家觉得创建容器刷新容器这些基础操作都默认知道的,所以就都没说。
但我在分析springboot⾃动装配的时候,要先从 SpringApplication.run() ⽅法开始。
我们进⼊到 SpringApplication 这个类中看⼀下 run() ⽅法的核⼼实现,差不多每⼀⾏我都加上了注释了。
SpringApplication.run() ⽅法中,我把关键点⽤序号标识出来了。
1. 第⼀个就是创建ApplicationContext容器。
routine是什么意思2. 第⼆个是刷新ApplicationContext容器。
在创建ApplicationContext时,会根据⽤户是否明确设置了 ApplicationContextClass 类型以及初始化阶段的推断结果,决定为当前SpringBoot应⽤创建什么类型的ApplicationContext。
heeljob com
superdisk创建完成ApplicationContext容器后,我们接着回到 SpringApplication.run() ⽅法中。英语四级的评分标准
清澄的意思
下⾯开始初始化各种插件在异常失败后给出的提⽰。
接电话用英语怎么说然后执⾏准备刷新上下⽂的⼀些操作。其实 prepareContext() ⽅法也是⾮常关键的,它起到了⼀个承上启下的作⽤。下⾯我们来看⼀下 prepareContext() ⽅法⾥⾯具体执⾏了什么。
key got crew关键的地⽅我也标注出来了,主要就是 getAllSoures() ⽅法,这个⽅法中,获取到的⼀个source就是启动类DemoApplication。
这样就通过获取这个启动类就可以在后load()⽅法中取加载这个启动类到容器中。
然后,后⾯再通过 tLoaded(context) ;
将所有监听器加载到ApplicationContext容器中。
最后就是我们上⾯说的核⼼的第⼆部刷新ApplicationContext容器操作,如果没有这⼀步操作上⾯的内容也都⽩做的,通
过 SpringApplication的refreshContext(context) ⽅法完成最后⼀道⼯序将启动类上的注解配置,刷新到当前运⾏的容器环境中。
启动类上的注解
上⾯我们说到在SpringApplication的 run() ⽅法中,通过调⽤⾃⼰的 prepareContext() ⽅法,在 prepareContext() ⽅法中⼜调always online什么意思
⽤ getAllSources() ⽅法,然后去获取启动类,然后通过SpringApplication的 load() ⽅法,去加载启动类,然后在刷新容器的时候就会去将启动类在容器中进⾏实例化。
在刷新ApplicationContext容器时,就开始解析启动类上的注解了。
启动类 DemoApplication 就只有⼀个注解 @SpringBootApplication ,那么下⾯来看⼀下这个注解:
可以看到这个注解是⼀个复合注解,有三个关键注解需要说明⼀下。
@SpringBootConfiguration
@SpringBootConfiguration 这个注解说明再点进去查看详情发现就是⼀个@Configuration 注解,这说明启动类就是⼀个配置类。⽀持Spring以JavaConfig的形式启动。
@ComponentScan
这个注解,从字⾯的意思上也能看出来,就是组件扫描的意思,即默认扫描当前package以及其⼦包下⾯的spring的注解,例
如: @Controller 、 @Service 、 @Component 等等注解。
@EnableAutoConfiguration
@EnableAutoConfiguration 这个注解也是⼀个复合注解:
staff
这个注解是⽐较核⼼的⼀个注解,springboot的主要⾃动配置原理基本上都来⾃@EnableAutoConfiguration这个注解的配置,那么我们通过看这个注解的源码可以发现有两个注解⽐较重要的。
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage 这个注解字⾯的意思是 ⾃动配置包 ,那么我们点进去看看⾥⾯是什么样的。