Spring之Bean生命周期源码解析

news/2024/5/20 5:58:16

Spring之Bean生命周期源码解析

在Spring框架中,Bean是一个非常重要的概念,它是Spring容器中的基本构建块。在Spring容器中,Bean的生命周期是非常重要的,因为它涉及到Bean的创建、初始化、销毁等过程。本文将对Spring之Bean生命周期的源码进行解析。

Bean的生命周期

在Spring容器中,Bean的生命周期可以分为以下几个阶段:

  1. 实例化Bean对象
  2. 设置Bean的属性值
  3. 调用Bean的初始化方法
  4. Bean可以使用
  5. 调用Bean的销毁方法

Bean的生命周期源码解析

实例化Bean对象

在Spring容器中,Bean的实例化是通过BeanFactory的getBean方法实现的。在getBean方法中,会先从缓存中获取Bean实例,如果缓存中不存在,则会通过反射机制创建Bean实例。

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {// 从缓存中获取Bean实例Object beanInstance = resolveBeforeInstantiation(beanName, mbd);if (beanInstance != null) {return beanInstance;}// 创建Bean实例return doCreateBean(beanName, mbd, args);
}

设置Bean的属性值

在Bean实例化之后,Spring容器会通过反射机制为Bean设置属性值。在设置属性值之前,Spring容器会先进行依赖注入,即将Bean依赖的其他Bean注入到当前Bean中。

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {// 进行依赖注入AutowireUtils.fillMergedBeanDefinition(mbd, beanName, bw);// 设置Bean的属性值applyPropertyValues(beanName, mbd, bw, mbd.getPropertyValues());
}

调用Bean的初始化方法

在Bean的属性值设置完成之后,Spring容器会调用Bean的初始化方法。在Spring中,Bean的初始化方法可以通过实现InitializingBean接口或在Bean定义中指定init-method属性来实现。

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {// 调用Bean的初始化方法invokeInitMethods(beanName, wrappedBean, mbd);return wrappedBean;
}

Bean可以使用

在Bean的初始化方法调用完成之后,Bean就可以使用了。此时,Bean已经被完全初始化,可以被其他Bean所依赖。

调用Bean的销毁方法

在Spring容器关闭时,会调用所有Bean的销毁方法。在Spring中,Bean的销毁方法可以通过实现DisposableBean接口或在Bean定义中指定destroy-method属性来实现。

protected void destroyBean(String beanName, Object beanInstance, @Nullable RootBeanDefinition mbd) {// 调用Bean的销毁方法invokeDestroyMethods(beanName, wrappedBean, mbd);
}

总结

在Spring框架中,Bean的生命周期是非常重要的,它涉及到Bean的创建、初始化、销毁等过程。通过对Spring之Bean生命周期源码的解析,我们可以更好地理解Spring容器是如何管理Bean的生命周期的。


http://www.mrgr.cn/p/15412040

相关文章

恋爱中的Java多线程:从单身到共舞的浪漫指南(一)

引言:孤独的线程,寂寞的码农 开篇小剧场: ​ 深夜,孤独的程序猿凯叔接到新任务:优化程序性能,探索多线程。这一任务成了他跳出孤独、寻求生活并行美好的契机。从简单的Thread类到复杂的线程池管理&#xff…

【汇总】虚拟机网络不通(Xshell无法连接虚拟机)排查方法

搜索关键字关键字关键字:虚拟机虚拟机虚拟机连接失败、虚拟机无法连接、Xshell连接失败、ping baidu.com失败、静态IP设置 Kali、CentOS、远程连接 描述:物理机无法连接虚拟机;虚拟机无法访问百度,虚拟机无法访问baidu.com 虚拟机…

C# WCF服务(由于内部错误,服务器无法处理该请求。)

由于内部错误&#xff0c;服务器无法处理该请求。有关该错误的详细信息&#xff0c;请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端&#xff0c;或打开对每个 Microsoft .NET …

为 Flutter 应用设置主题:ThemeData 和 ColorScheme 指南

在媒体和其他来源中有许多关于这个主题的文章&#xff0c;那么这篇文章的必要性是什么&#xff1f; 在本文中&#xff0c;我计划仅关注 ThemeData 小部件的关键点以及我的开发经验中最常用的参数&#xff0c;并且您将获得有关每个参数如何对您的应用程序执行操作的简要说明。 …

Linux:进程信号

生活角度的信号 a.信号在生活中&#xff0c;随时可以产生(信号的产生和我是异步的) b.你能认识这个信号 c.我们知道信号产生了&#xff0c;我能识别这个信号&#xff0c;信号该怎么处理 d.我们可能正在做着更重要的事情&#xff0c;把到来的信号暂不处理(1.我记得这个事 2.…

分布式 ID 的实现方案——Java全栈知识(13)

分布式 ID 的实现方案 当我们分表的情况下&#xff0c;如何实现全局唯一 ID 也是一个问题&#xff0c;数据库的唯一索引在 分布式 ID 也就是全局唯一 ID 生产方案需要满足以下几个条件&#xff1a; 高可用高性能安全性自增性唯一性 1、UUID UUID&#xff08;Universally Un…

cobalt strike安装教程

将本地IP和密码填入:./teamserver 192.168.xx.xx 密码 启动成功

初识C语言——第十五天

初识结构体1 //结构体可以让C语言创建新的类型出来 //创建一个学生struct Stu {char name[20];int age;double score;}; //创建一个书的类型 struct Book {char name[20];float price;char id[30]; };//int main() //{ // struct Stu s { "张三",20,85.5 };//结…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介 这简直就是歧视,在MDT使用变量时,数据库设置时,居然不能用中文。 计算机描述,我将在数据库中设置为使用人,主要是其他地方也不方便看。 描述是存在注册表中的,未来自动化也将会使用使用人这个字段,用来注册OCS这样,有标签,使用人字段的软件。 方向 解决MDT/BDD无…

蓝桥杯练习系统(算法训练)ALGO-950 逆序数奇偶

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 老虎moreD是一个勤于思考的青年&#xff0c;线性代数行列式时&#xff0c;其定义中提到了逆序数这一概念。不过众所周知我们…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了…

刷题训练之模拟

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握模拟算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题训…

Ansible——playbook编写

一、简介 1.什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook 本质上是一些框架&#xff0c;是一些预先编…

pytest教程-41-钩子函数-pytest_runtest_teardown

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_call钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_teardown钩子函数的使用方法。 pytest_runtest_teardown 钩子函数在每个测试用例执行完成后被调用&…

商务分析方法与工具(五):Python的趣味快捷-文件和文件夹操作自动化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Web前端三大主流框架是什么?

Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位&#xff0c;各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架&#xff0c;最初版本称为AngularJS&#xff0c;后来升级为Angular。它是一个完整的…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 &#xff08;1&#xff09;白鲸优化算法BWO 参考文献&#xff1a;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. &#xff08;2&#xff09;龙格-库塔优化…

三维建模技术在AI去衣中的奇妙应用

引言&#xff1a; 随着计算机视觉和深度学习技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;在图像处理和理解方面取得了显著进展。其中&#xff0c;一个颇具争议却技术上引人入胜的应用便是AI去衣——即使用AI技术从图片或视频中移除人物的衣物。尽管这技术常因…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…