spring部分源码分析及Bean的生命周期理解

前言:

本文整体框架是通过refresh方法这个入口进入分析:分析IOC容器的创建及一些Bean的生命周期的知识点,写得确实一般般,感觉自己的有些前置知识并没有理解的很到位,所以,这篇文件先记录一下,等以后理解得好了再来更新。


整体的流程:

 

 我们先将bean的配置信息写在配置文件中,再通过ClassPathXmlApplicationContext类读取,并管理。

这个图中的入口还有一个概念:

beandefinition:在Spring框架中,BeanDefinition是描述和定义Spring容器中的Bean的元数据对象。它包含了定义Bean的相关信息,例如Bean的类名、作用域、生命周期等。

接着我们打断点进入:

 

1: this.prepareRefresh()

这个方法就是定义spring容器的一些基本信息

该方法会主要做准备操作,设置初始化的数据和当任何属性资源激活后设置活动的标记。还会保存一些监听器。

2:this.obtainFreshBeanFactory()

refreshBeanFactor:创建了一个新的BeanFactory:ConfigurableListableBeanFactory

 

这里的this.loadBeanDefinitions(beanFactory)就会从配置文件中加载容器的信息。

3:this.prepareBeanFactory(beanFactory);

创建BeanFactory之后,还需要对这个BeanFactory进行一个准备工作:

例如:类加载器和后置处理器

4:this.postProcessBeanFactory(beanFactory);

我们点进去之后发现这个方法啥都没有,

这是一个空接口,允许开发人员往这个接口中加入自定义逻辑。

不同的spring容器也可以做不同的操作。

5:this.invokeBeanFactoryPostProcessors(beanFactory)

这个方法我们顾名思义调用BeanFactory的后处理器的方法,但是这个时候并不会创建Bean对象

 我们看这段源码之前,我们还涉及到了两个接口:

  • BeanFactoryPostProcessor:允许你修改现有 Bean 的定义,但不能注册新的 Bean 定义。
  • BeanDefinitionRegistryPostProcessor:允许你修改 Bean 定义和注册新的 Bean 定义,它是更高级的,通常在更早的阶段执行。

我们点进来看看。 

这段源码的逻辑比较复杂,总结下来说就是invokeBeanFactoryPostProcessors() 方法的确是用来处理 BeanFactory 的配置和注册后处理器的

 6:this.registerBeanPostProcessors(beanFactory):

这也是在注册后处理器,不过这个是专门的关于Bean生命周期的后处理器

简单理解下来就是:这个方法注册的后处理器更多,而且是与 Bean 生命周期相关的后处理器

并且这个方法也会根据不同的IOC容器进行一个注册。

7:this.initMessageSource(); this.initApplicationEventMulticaster();

国际化,applicationContext默认是支持国际化的,因为他继承了MessageSource接口所以能够实现国际化,这里不进行说明了,如有兴趣可以查询该链接


在Spring容器中初始化事件广播器,事件广播器用于事件的发布。

程序首先会检查bean工厂中是否有bean的名字和这个常量(applicationEventMulticaster)相同的,如果没有则说明没有那么就使用默认的ApplicationEventMulticaster 的实现:SimpleApplicationEventMulticaster

8: onRefresh():

点进去:

这也是一个空方法,也是留着给后面进行扩展

我们也可以感觉到,像spring这种牛逼的框架,留的扩展点也真的是不少。

9:this.registerListeners()

 注册应用的监听器。

在 Spring 框架中,registerListeners() 方法主要用于注册应用上下文(ApplicationContext)中的事件监听器。它是一个重要的机制,通过此机制,Spring 可以实现事件驱动的编程模型

这一个监听器的理解,我觉得我理解并不好,问了GPT,也不明白什么意思,这里留一个

TODO

如果以后有机会会回来补充的。 

10:this.finishBeanFactoryInitialization(beanFactory);

finishBeanFactoryInitialization 是 Spring 框架中一个关键的方法,用于完成 BeanFactory 的初始化过程它确保所有的 Bean 都已正确初始化并且容器处于可用状态

这个方法也涉及到Bean的生命周期。

Bean的生命周期:

流程图:

代码演示:

1:定义一个普通类:
public class BeanTest implements BeanNameAware, InitializingBean , DisposableBean {private String name;public BeanTest() {System.out.println("实例化");}public String getName() {return name;}public void setName(String name) {System.out.println("依赖注入");this.name = name;}public void init(){System.out.println("初始化");}public void destory(){System.out.println("销毁");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean方法执行");}@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware方法执行");}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean方法执行");}
}
2:配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="a" class="com.javassmprojects.bean3.BeanTest" init-method="init" destroy-method="destory"><property name="name" value="BeanTest"></property></bean><bean id="MyProcessor" class="com.javassmprojects.bean3.MyPostProcess"></bean>
</beans>
3:MyPostProcessor:
public class MyPostProcess implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if("a".equals(beanName)){System.out.println(beanName+"我是后处理器的before方法");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if("a".equals(beanName)) {System.out.println(beanName + "我是后处理器的after方法");}return bean;}
}
4:创建测试类测试:
class BeanTestTest {@Testpublic void test01(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beantest.xml");applicationContext.getBean("a");System.out.println("使用Bean对象");((ClassPathXmlApplicationContext)applicationContext).close();}}

测试结果:

实例化
依赖注入
BeanNameAware方法执行
a我是后处理器的before方法
InitializingBean方法执行
初始化
a我是后处理器的after方法
使用Bean对象
15:13:48.503 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext -- Closing org.springframework.context.support.ClassPathXmlApplicationContext@4fb0f2b9, started on Tue Jul 23 15:13:48 CST 2024
DisposableBean方法执行
销毁

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

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

相关文章

推荐一款开箱即用、开源、免费的中后台管理系统模版

项目介绍 vue-pure-admin 是推荐一款开箱即用、开源&#xff08;遵循MIT License开源协议&#xff09;、免费的中后台管理系统模版&#xff0c;完全采用 ECMAScript 模块&#xff08;ESM&#xff09;规范来编写和组织代码&#xff0c;使用了最新的 Vue3、 Vite、Element-Plus、…

无人机图像目标检测技术详解

当前研究领域的热点之一。无人机搭载的高清摄像头能够实时捕获大量图像数据&#xff0c;对这些数据进行有效的目标检测对于军事侦察、环境监测、灾害救援等领域具有重要意义。本文将对无人机图像目标检测技术进行详解&#xff0c;包括图像处理技术、目标检测算法、关键技术应用…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

C语言数据结构课设:基于EasyX前端界面的飞机订票系统

数据结构课程设计说明书 学 院、系&#xff1a; 软件学院 专 业&#xff1a; 软件工程 班 级&#xff1a; 学 生 姓 名&#xff1a; 范 学 号&#xff1a; 设 计 题 目&#xff1a; 飞机订票系统 起 迄 日 期: 2024年6月18日~ 20…

【测试能力提升-AI】AI介绍

注释&#xff1a; 搞python的最终梦想&#xff0c;搞机器&#xff0c;玩深度&#xff0c;通网络&#xff0c;知模型&#xff0c;拿下AI技术&#xff0c;尽管只是测试&#xff0c;但是也是有梦想的 1. 目标 完成AI任务 ---- 掌握成熟、标准的任务解决方法掌握AI工具 ---- 完成…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块-B-4Web渗透测试

前言 本章节我将尝试操作B-4模块的渗透测试&#xff0c;搭建环境很难&#xff0c;还望大家点点赞多多支持&#xff01; 任务概览 最后4、5、6有一定的难度。 环境要求 kali Linux192.168.41.2Web服务器&#xff08;假设为PYsystem 2020 模拟平台&#xff09;192.168.41.7交换…

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

【实战】Spring Cloud Stream3.0 整合RocketMq

文章目录 前言技术积累Spring Cloud Stream3.0新特性RocketMq简介 实战演示引入Maven依赖增加application配置消息生产者消息消费者 前言 相信很多同学用使用过rocketmq消息中间件&#xff0c;且大多情况下是使用原生的rocketmq-spring-boot-starter 进行集成然后创建一个rock…

Spring中Bean的循环依赖

目录 定义&#xff1a; 循环依赖的后果&#xff1a; 一&#xff1a;三级缓存 1、大概的思路&#xff1a; 注意&#xff1a; 2、执行过程&#xff1a; A半完成&#xff1a; B完成&#xff1a; A完成&#xff1a; 注&#xff1a; 二&#xff1a;Lazy 定义&#xff1a; …

入门C语言只需一个星期(星期三)

点击上方"蓝字"关注我们 01、基本数据类型 char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCIIsigned char 1 字节 −128 ~ 127 -unsigned char 1 字节 0 ~ 255 -int…

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…

CV13_混淆矩阵、F1分数和ROC曲线

1.1 混淆矩阵Confusion Matrix 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习和统计学中用于描述监督学习算法性能的特定表格布局。它是一种特定类型的误差矩阵&#xff0c;可以非常直观地表示分类模型在测试数据集上的预测结果与实际结果之间的对比。 混淆矩…

【数据结构】初识集合框架

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

Python爬虫(6) --深层爬取

深层爬取 在前面几篇的内容中&#xff0c;我们都是爬取网页表面的信息&#xff0c;这次我们通过表层内容&#xff0c;深度爬取内部数据。 接着按照之前的步骤&#xff0c;我们先访问表层页面&#xff1a; 指定url发送请求获取你想要的数据数据解析 我们试着将以下豆瓣读书页…

河南萌新联赛2024第(二)场:南阳理工学院

A 国际旅行Ⅰ D A*BBBB F 水灵灵的小学弟 H 狼狼的备忘录 I 重生之zbk要拿回属于他的一切 J 这是签到 ##A 国际旅行Ⅰ 链接&#xff1a;https://ac.nowcoder.com/acm/contest/87255/A 来源&#xff1a;牛客网 题目描述 很久很久以前&#xff0c;有 n n n 个国家&#xff0c;第…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针&#xff0c;对于3/4/5为一组地跳跃。起初想的是后瞻性&#xff0c;如果符合0-9任意&#xff0c;则更换index、跳跃。此时写了一个函数&#xff0c;用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去&#xff0c;虽然…

昇思25天学习打卡营第九天|本地安装mindspore之一|Linux的系统在vmware上的安装以及mindspore的安装

课程已经学完了&#xff0c;打算再深入一些。初步的想法是&#xff0c;在本地安装&#xff0c;本地执行。 根据老师的指引&#xff0c;MindSpore官网&#xff0c;“https ://www.mindspore.cn/install/”&#xff0c;注意&#xff0c;因为csdn博客编辑器的原因&#xff0c;当我…

软考:软件设计师 — 6.信息安全

六. 信息安全 1. 加密技术与认证技术 &#xff08;1&#xff09;对称与非对称加密 关于对称与非对称加密算法的详细内容&#xff0c;可以参考文章&#xff1a;信息安全基础技术与原理 对称加密 对称加密也称为共享密钥加密。 对称加密中&#xff0c;加密和解密的密钥是同一…

【豆包Marscode体验官】揭秘MarsCode AI编辑助手:高效智能编辑新纪元之入门指导与最佳实践

文章目录 1. 概述2. 工具使用过程2.1 MarsCode插件简介2.2 安装和配置2.2.1 安装MarsCode插件2.2.2 配置MarsCode插件 2.3 各个功能的使用2.3.1 代码补全2.3.2 代码补全 Pro【操作提示&#xff0c;No suggestion from Model&#xff0c;不知道是不是版本的问题】2.3.3 代码生成…