Spring之IOC容器的自动转配原理

上文我们介绍了spring boot是如何启动的,那么bean的自动装配发生在第四个大阶段容器填充

自动装配bean供分为12个小步骤

第一步,通过prepareRefresh方法,在已有的系统环境上准备servlet相关的环境Environment,其他的环境配置在第二个大阶段“环境准备”中已经注册完成了;通过初始化属性资源initServletPropertySources方法对servlet初始化参数servContextletInitParams和servletConfigInitParams进行赋值
在这里插入图片描述
然后检验是否有必填的环境变量在这里插入图片描述

最后,完成监听器和事件初始化之后环境准备就完成了

第二步和第三步,通过obtainFreshBeanFactory和prepareBeanFactory方法,在获取容器同时再使用BeanFactory之前进行一些准备工作,由于spring boot选择了servletWebServerApplicationContext作为容器,在之前已经构造好beanfactory了,所以obtainFreshBeanFactory中不进行任何处理,不过对于原始的spring来说很多情况下会选择ClassPathXmlApplicationContext作为容器,每次执行obtainFreshBeanFactory时会通过它的refreshBeanfactory方法重新构造beanfactory,并重新加载bean定义
在这里插入图片描述
在prepareBeanFactory方法中,主要准备类加载器BenaClassLoader,表达式解析器BeanExpressionReslover,配置文件处理器propertyEditorRegisrar等系统级处理器,以及两个bean后置处理器,用来解析aware接口的ApplicationContextAwareProcessor,用来处理自定义监听器注册和销毁的ApplicationListenerDetector,同时会注册一些特出bean和系统bean,比如容器本身beanFactory和ApplicationContext,系统环境environment,系统属性systemproperties,将它们放入特殊对象池和单例池中
在这里插入图片描述
第四步,通过postProcessorBeanFactory方法对beanFactory进行额外的设置或修改,这里主要定义
在这里插入图片描述
第五步,执行核心的invokeBeanFactoryPostProcessor方法,首先会逐一执行在第三个大阶段“容器准备”,注册的“各种beanFactory后置处理器”beanFactoryProcessor,其中最主要的就是用来加载所有“bean定义”的配置处理器configurationClassPostProcessor,通过它架子啊所有@Configuration配置类,同时检索指定的bean扫描路径componentScans,然后通过bean扫描器ClassPathBeanDefinitionScans中的doScan方法扫描每个类,将所有扫描出来的“bean定义”都放在bean定义池beanDefinitionMap中,同样也会扫描所有加了@bean,@import等注解的类和方法,将它们对应的bean定义放在bean定义池,这样后续可以通过这些bean定义进行bean的构造
在这里插入图片描述
第六步**,通过registerBeanPostProcessor方法检索所有的bean后置处理器
第七步和第八步:通过initMessageSource和initApplicationEventMulticaster方法从单力池中获取两个实用的bean放在applicationcontext中,一个是用于国际化“messageSource”的bean
在这里插入图片描述
另一个是用于自定义广播事件,名为initApplicationEventMulticaster的bean,有了它就可以通过publishEvent方法进行事件的发布了

在这里插入图片描述
第九步,通过onRefresh构造并启动web服务器,先查找实现了servletwebServerFactory这个接口的服务器bean,默认的是tomcat,接下来通过getWebServer方法构造一个tomcat对象并通过start方法启动,这样web服务器就开始启动了

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


第十一步,通过finishBeanFactoryinitialization方法来生产所有的bean,整体分为构造对象,填充属性,初始化实例,注册销毁四个步骤,bean生成之后会放入单例池,singletonObjects中
在这里插入图片描述
第十二步,通过finishRefresh方法构造并注册“生命周期管理器“lifeCycleProcessor,同时会调用所有实现了lifeCycle接口的bean中的start方法,当然在容器关闭时也会调用stop方法,接着发布容器刷新完成事件 ,整个12步 填充容器就完成了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/279150.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用mysql去除表中重复的字段

简介: 此处的建表题目来自我们的也门哥Maged,非常感谢他出的这些测试题目,让我能够独立思考,反复试去找到cw2的正确做法。 数据库准备: 害怕被好homi被刺然后被 academic warning 所以浅浅打个码。 创建好这张表后我…

【LeetCode刷题】-- 133.克隆图

133.克隆图 本题就是遍历整个图&#xff0c;遍历的时候要记录已经访问过的节点 方法一&#xff1a;深度优先搜索 /* // Definition for a Node. class Node {public int val;public List<Node> neighbors;public Node() {val 0;neighbors new ArrayList<Node>(…

【第3期】Springboot集成SpringSecurity+RSA+ECS免密登录

本期简介 RSA是非常安全的非对称加解密算法&#xff0c;单纯的RSA的原理和使用网络资料较多&#xff0c;本期不细讲RSA的原理&#xff0c;主要讲解实战&#xff0c;如何与SpringbootSpringSecurity集成起来&#xff0c;做到在安全框架基础上&#xff0c;对用户的密码进行加密存…

maven+spock

pom配置 话说JunitMockito的组合用起来是真难用&#xff0c;还是Spock的简单&#xff0c;尤其是参数化的测试。junit的Parameter是鸡肋&#xff0c;杂恶心&#xff1b;Theories用来也不爽。 <?xml version"1.0" encoding"UTF-8"?><project xm…

html的学习笔记

开发工具&#xff1a;vscode 文字标签 h1:一级标题&#xff0c;h2&#xff1a;二级标题h6 p&#xff1a;段落标签 hr&#xff1a;分隔线 br&#xff1a;换行 strong/b&#xff1a;文字加粗 ins/u:下划线 em/i&#xff1a;倾斜 del/s&#xff1a;删除线 媒体标签 图片…

Mybatis-plus介绍与入门

前言 MyBatis-Plus是在MyBatis基础上的一个增强工具库&#xff0c;旨在简化开发者的工作&#xff0c;提高开发效率&#xff0c;同时保留MyBatis的灵活性。使用 MyBatis-Plus 可以减少重复性的代码&#xff0c;简化常见的数据库操作 官方学习文档&#xff1a;MyBatis-Plus (bao…

死锁 + 条件变量 + 生产消费者模型

文章目录 死锁如何解决死锁问题呢&#xff1f;避免死锁 同步条件变量生产消费者模型 死锁 现象 &#xff1a; 代码不会继续往后推进了 问题 一把锁有没有可能产生死锁呢&#xff1f; 有可能 线程第一次申请锁成功&#xff0c;继续再次申请&#xff0c;第二次申请就失败了&am…

从纸笔到屏幕:我的CS笔记记录体验分享

前言 三年大学生活里&#xff0c;我花了很多时间在记录笔记上&#xff0c;也因为现有种类繁多的各种学习方式&#xff0c;和朋友一起走了很多弯路。纸笔&#xff0c;OneNote&#xff0c;Typora…… 想总结分享一下自己大学期间的学习笔记记录方式&#xff08;主要针对计算机学…

不同的葡萄品种的葡萄酒有什么共同特质?

在某种程度上几乎所有的葡萄酒都是混合的&#xff0c;在大多数葡萄酒产地&#xff0c;法律允许在单一品种葡萄酒中混入高达15%的另一种葡萄酒&#xff0c;且还能被称为由主要葡萄酿造的单一品种葡萄酒酒。这些单一品种葡萄酒混合了少量其他葡萄酒&#xff0c;是为了创造一个特质…

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 &#xff0c;操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

【DataSophon】大数据管理平台DataSophon-1.2.1基本使用

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

通过WinCC基本功能实现批次查询及批次报表

谈到WinCC中的批次数据处理和批次报表&#xff0c;也许有人会想到PM-Quality这款专业的批次报表软件。但如果你的银子有限&#xff0c;批次报表要求又比较简单&#xff0c;不妨看看此文。 —《通过 WinCC 基本功能实现批次数据过滤查询以及打印批次数据报表》 实现的功能描述 …