spring Bean 生命周期 源代码分析

文章目录

    • 一、生命周期关键步骤
        • `1.1 前置条件`
        • `1.2 创建bean`
    • 二、Bean生命周期、核心源码分析
        • 2.1 前置条件, 源代码
        • 2.2 创建bean, 源代码


一、生命周期关键步骤

1.1 前置条件

1.创建rootBean
生成RootBeanDefinition

2.对bean定义的方法,进行验证、重写
调用方法prepareMethodOverrides()

3.返回一个代理对象,用于在实例化前、或实例化后,指定插入切面逻辑
调用方法resolveBeforeInstantiation()

1.2 创建bean

1.前置条件完成后,实例化Bean

2.合并BeanDefinition的后置处理器,允许修改或合并bean的定义。

3.构建Bean单例

4.Bean实例填充属性值
方法是populateBean

5.初始化Bean
(1)设置bean的BeanName、BeanClassLoader、BeanFactory; 方法是invokeAwareMethods
(2)初始化前置处理, 方法是applyBeanPostProcessorsBeforeInitialization
(3)具体初始化, 方法是invokeInitMethods; 判断是否自定义初始化 invokeCustomInitMethod
(4)初始化后置处理, 方法是applyBeanPostProcessorsAfterInitialization

6.处理Bean的引用,或抛出循环依赖异常

7.注册bean的销毁


二、Bean生命周期、核心源码分析

源码类名是:AbstractAutowireCapableBeanFactory

创建bean入口
createBean(Class beanClass)

再调用createBean的重载方法
createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

createBean是bean创建的前置条件

再调用doCreateBean
doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)

doCreateBeanbean创建的核心逻辑

2.1 前置条件, 源代码

在这里插入图片描述

2.2 创建bean, 源代码

在这里插入图片描述



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

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

相关文章

5G NR 频率计算

5G中引入了频率栅格的概念,也就是小区中心频点和SSB的频域位置不能随意配置,必须满足一定规律,主要目的是为了UE能快速的搜索小区;其中三个最重要的概念是Channel raster 、synchronization raster和pointA。 1、Channel raster …

用的到的linux-查找find-Day4

前言: 在上一节,我们了解到rm删除命令,一共拥有三种模式,即-i默认只能删除文件且会提示确认,其次是-r 遍历删除,用于删除目录及目录下的文件,同样需确认后才会删除,最后为-f为强制删…

猫头虎分享已解决Bug || TypeError: Cannot set property ‘innerHTML‘ of null

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

网络学习:数据链路层VLAN原理和配置

一、简介: VLAN又称为虚拟局域网,它是用来将使用路由器的网络分割成多个虚拟局域网,起到隔离广播域的作用,一个VLAN通常对应一个IP网段,不同VLAN通常规划到不同IP网段。划分VLAN可以提高网络的通讯质量和安全性。 二、…

探索C语言中的联合体与枚举:数据多面手的完美组合!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 联合体的定义 联合体又叫共用体,它是一种特殊的数据类型&…

leetCode二叉树的堂兄弟节点

题目描述 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以…

从概念到实践:数字孪生在智慧城市建设中的应用与挑战

一、引言 随着科技的飞速发展,数字孪生这一概念逐渐受到广泛关注。数字孪生通过建立物理世界的数字模型,为城市的管理和规划提供了前所未有的可能性。智慧城市作为现代城市发展的重要趋势,正逐渐成为人们关注的焦点。本文将探讨数字孪生在智…

编译原理实验3——自下而上的SLR1语法分析实现(包含画DFA转换图、建表、查表)

文章目录 实验目的实现流程定义DFA状态实现代码运行结果测试1测试2测试3 总结 实验目的 实现自下而上的SLR1语法分析,画出DFA图 实现流程 定义DFA状态 class DFA:def __init__(self, id_, item_, next_ids_):self.id_ id_ # 编号self.item_ item_ # productio…

Redis保证数据不丢失的手段

Redis 保证数据不丢失的主要手段有两个: 持久化集群运行 我们分别来看它们两的具体实现细节。 # 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中(如硬盘)的过程,以便在程序重启或者系统崩溃等情况下&#xf…

C++完成使用map Update数据 二进制数据

1、在LXMysql.h和LXMysql.cpp分别定义和编写关于pin语句的代码 //获取更新数据的sql语句 where语句中用户要包含where 更新std::string GetUpdatesql(XDATA kv, std::string table, std::string where); std::string LXMysql::GetUpdatesql(XDATA kv, std::string table, std…

机器学习之指数分布

指数分布: 指数分布可以用来表示独立随机事件发生的时间间隔。如果一个随机变量X的概率密度函数满足以下形式,就称X服从参数λ的指数分布,记作X ~ E(λ)或X~Exp(λ)。指数分布只有一个指数参数,且λ>0&a…

c++多态(3) -- 虚析构函数

代码: enum class _ANIMALS_TYPE {CAT,DOG,ANIMAL_COUNT };class Animal { public:Animal(_ANIMALS_TYPE type, int age,const char* name);~Animal();virtual void eat()const 0; private:_ANIMALS_TYPE type; // 动物类型int age; // 动物年龄char* na…