嵌入式 linux 系统开发网络的设置

Spring中IOC容器的创建原理也就是SpringBoot启动流程中的第四个大阶段“填充容器”,即面试最频繁问到的步骤“如何自动装配Bean”
共分为12个小步骤

1.prepareRefresh

第一步通过prepareRefresh方法在已有的“系统环境”基础上,准备servle相关的环境Environment,其他的环境配置在第二个大阶段“环境准备”中就已经注册完成了。
通过“初始化属性资源”initServletPropertySources方法对“Servlet初始化参数”servletContextInitParams和servletConfigInitParams进行赋值
在这里插入图片描述
然后通过validateRequireProperties方法检验是否有必填的环境变量,可以在自定义“初始化属性资源”initPropertySources方法中通过setRequireProperties将某些环境变量设置为必填
在这里插入图片描述
在这里插入图片描述
最后完成监听器和事件初始化之后,环境准备就完成了。

2.obtainFreshBeanFactory

3.prepareBeanFactory

第二步和第三步,通过obtainFreshBeanFactory方法和prepareBeanFactory方法,在获取容器同时在使用BeanFactory之前进行一些准备工作。
由于SpringBoot选择了servletWebServerApplicationContext作为容器,并且在之前步骤已经构造好beanFactory了,所以obtainFreshBeanFactory中不进行任何处理(这就是为什么第二步和第三步一起讲的原因)

注意:对于原始的Spring来说,很多情况下都会选ClassPathXmlApplicationContext作为容器,每次执行obtainFreshBeanFactory时,会通过它的refreshBeanFactory方法重新构造beanFactory并重新加载“Bean定义”BeanDefinition。

而在准备容器prepareBeanFactory的过程中,主要准备“类加载器”BeanClassLoader、“表达式解析器”BeanExpressionResolver、“配置文件处理器”PropertyEditorRegistrar等系统级处理器以及两个“Bean后置处理器”:用来解析Aware接口的ApplicationContextAwareProcessor、用来处理自定义监听器注册和销毁的ApplicationListenerDetector
在这里插入图片描述

同时会注册一些“特殊Bean”和“系统级Bean”,比如容器本身BeanFactory和ApplicayionContext、系统环境environment、系统属性systemProperties等。
将他们放入“特殊对象池”和“单例池”中
在这里插入图片描述

4.postProcessBeanFactory

第四步通过postProcessBeanFactory方法,对BeanFactory进行额外设置或修改。这里主要定义了包括request、session在内的Servlet相关作用域Scopes,同时也注册与servlet相关的一些特殊Bean,包括ServletRequest、ServletResponse、HttpSession等
在这里插入图片描述

5.invokeBeanFactoryPostProcessors(最核心)

第五步执行invokeBeanFactoryPostProcessors方法
首先会逐一执行在第三个大阶段“容器创建”中注册的各种“BeanFactory后置处理器”beanFactoryPostProcessor,其中最主要的就是用来加载所有“Bean定义”的“配置处理器ConfigurationClassPostProcessor(通过它加载所有@Configuration配置类),
同时检索我们指定的”Bean扫描路径“componentScans,然后通过”Bean扫描器“ClassPathBeanDefinitionScanner中doScan方法扫描每个类,将所有扫描出来的”Bean定义“放到”Bean定义池“beanDefinitionMap中,同样也会扫描所有加了@Bean、@Import等注解的类和方法,将他们对应的也”Bean定义“放到”Bean定义池“beanDefinitionMap中,这样后续就可以通过Bean定义构造相应的Bean对象了

6.registerBeanPostProcessors

第六步通过registerBeanPostProcessors方法检索所有的”Bean后置处理器“,同时根据指定的order为它们进行排序,然后放入”后置处理器池“beanPostProcessors中。
每一个”Bean后置处理器“都会在Bean初始化之前和之后分别执行对应的逻辑
在这里插入图片描述

7.initMessageSource

8.initApplicationEventMulticaster

第七步和第八步会通过initMessageSource和initApplicationEventMulticaster方法从”单例池“中获取两个非常实用的Bean放在Application中
一个是用于国际化,名为”messageSource“的Bean,我们可以通过自定义名为”messageSource“的Bean结合messages.properties配置文件就可以进行多语言的切换配置了
在这里插入图片描述
另一个是用于自定义广播事件,名为”applicationEventMulticaster“的Bean,使用它就可以通过publishEvent方法进行事件的发布了。
在这里插入图片描述

9.onRefresh

第九步,通过onRefresh构造并启动Web服务器,先查找实现了ServletWebServerFactory这个接口的应用服务器Bean,默认的服务器是tomcat。接下来通过getWebServer方法构造一个Tomcat对象,同时通过start方法进行启动,这样web服务器就开始运行了
在这里插入图片描述

10.registerListeners

第十步,通过registerListeners方法在bean中查找所有的**”监听器Bean“**,将它们注册到第八步构造的”消息广播器“applicationEventMulticaster中
在这里插入图片描述

11.finishBeanFactoryInitialization

第十一步,通过finishBeanFactoryInitialization来生产我们所有的Bean,整体分为”构造对象、填充属性、初始化实例、注册销毁“四个步骤**(也就是Bean的生命周期)**
Bean生成之后会放到”单例池“singletonObjects中

12.finishRefresh

第十二步通过finishRefresh方法构造并注册”生命周期管理器“lifecycleProcessor,同时会调用所有实现了”生命周期接口“Lifecycle中的Bean中的start方法。同时在容器关闭时也会自动调用相应的stop方法。接着发布一个”容器刷新完成“的事件之后,填充容器就完成了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zywcxz/article/details/129266978