当前位置: 首页 > news >正文

手写简易 Spring(三)

文章目录

  • 三. 手写简易 Spring(三)
    • 1. Bean 对象初始化和销毁方法
      • 1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化
      • 2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁
      • 3. DefaultSingletonBeanRegistry 优秀的解耦方法
    • 2. 定义标记类型 Aware 接口,实现感知容器对象
      • 1. 定义
      • 2. ApplicationContextAwareProcessor 包装处理器
    • 3. Bean 对象作用域
      • 1. 定义
    • 4. 扩展其他框架 FactoryBean
      • 1. 定义
      • 2. FactoryBeanRegistrySupport 处理 FactoryBean 注册管理
    • 5. 我的代码结构
      • 1. 整体设计结构
      • 2. 我的调用类图(模拟 Spring 源码)
      • 3. 我的代码结构(模拟 Spring 源码)

三. 手写简易 Spring(三)

1. Bean 对象初始化和销毁方法

1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化

  • 核心实现类 XmlBeanDefinitionReader:添加解析 XML 的 init-method 的参数放入 BeanDefinition 对象
  • 核心抽象类 AbstractAutowireCapableBeanFactory:在调用 invokeInitMethod 方法初始化时先判断是否有 InitializingBean 初始化,再判断是否有 init-method 初始化,同时避免调用两次相同方法

2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁

  • 核心实现类 XmlBeanDefinitionReader:添加解析 XML 的 destroy-method 的参数放入 BeanDefinition 对象
  • DisposableBeanAdapter 类使用了适配器的设计模式,将俩销毁方法整合在一起
    • 先判断是否有 DisposableBean 销毁,再判断是否有 destroy-method 初销毁,同时避免调用两次相同方法
  • 核心抽象类 AbstractAutowireCapableBeanFactory:在初始化后调用 registerDisposableBeanIfNecessary 方法
    • 方法调用 DefaultSingletonBeanRegistry 类、注册带销毁的 BeanDefinition 对象
    • 存在 DisposableBean 或 destroy-method 就是带销毁的 BeanDefinition 对象
  • 解析 XML 与预加载单例对象后,手动注册销毁钩子时,调用 DefaultSingletonBeanRegistry 类的 destroySingletons 方法
    • DefaultSingletonBeanRegistry 类存在所有销毁的 BeanDefinition 集合,依次删除、同时调用 DisposableBeanAdapter 类整合的 destroy 方法

3. DefaultSingletonBeanRegistry 优秀的解耦方法

  • ConfigurableBeanFactory 接口定义了 destroySingletons 方法
  • AbstractBeanFactory 实现了 ConfigurableBeanFactory 接口但自己极其子类并未实现此方法
  • AbstractBeanFactory 交给了父类 DefaultSingletonBeanRegistry 实现 destroySingletons 方法,DefaultSingletonBeanRegistry 并没有实现 ConfigurableBeanFactory 接口因此无需 @Override
  • 核心就是 A 继承 B实现 C 时,C 的接口方法由 A 继承的父类 B 实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEh9XJkH-1682183583455)(:/810c4cb567e54a61910bfc5b38f84490)]

2. 定义标记类型 Aware 接口,实现感知容器对象

1. 定义

  • 允许 Bean 对象拿到 Spring 框架中的 BeanFactory、BeanClassLoader、BeanName、ApplicationContext 等
  • 我们可以定义 Aware 标记接口,通过 instanceof 判断
    • JDK 常用标记接口:Cloneable、Serializable、RandomAccess、Remote
  • 当前继承 Aware 的接口包括:BeanFactoryAware、BeanClassLoaderAware、BeanNameAware 和 ApplicationContextAware,获取对应对象
    • 前三者属于 BeanFactory,因此在 beans.factory 包下
    • ApplicationContextAware 属于 ApplicationContext,因此在 context 包下
    • ApplicationContext 需要像容器中注册 addBeanPostProcessor ,再由 createBean 调用 applyBeanPostProcessorsBeforeInitialization 时进行操作

2. ApplicationContextAwareProcessor 包装处理器

  • ApplicationContextAwareProcessor 实现 BeanPostProcessor 接口
    • 在 refresh() 方法操作时,把 ApplicationContext 注册到 BeanPostProcessor 容器
    • 在 createBean() 方法进行 BeanPostProcessor Before 处理时调用

3. Bean 对象作用域

1. 定义

  • 是否单例存放在 BeanDefinition 中,通过 ConfigurableBeanFactory 成员变量 SCOPE_SINGLETON、SCOPE_PROTOTYPE 来定义
  • 单例与否区别
    • DefaultListableBeanFactory#preInstantiateSingletons 是否进行预初始化
    • AbstractAutowireCapableBeanFactory#createBean 创建完成对象后是否放入到内存中
    • 是否注册 Disposable 销毁方法
  • 某个 Bean 对象是否单例,可通过 XmlBeanDefinitionReader 解析 XML 文件校验

4. 扩展其他框架 FactoryBean

1. 定义

  • MyBatis 就是实现了一个 MapperFactoryBean 类,交给 Spring 管理
  • createBean 执行对象实例化、属性填充、依赖加载、前置后置处理、初始化等操作后,就执行 FactoryBean 具体对象中的 getObject 对象

2. FactoryBeanRegistrySupport 处理 FactoryBean 注册管理

  • AbstractBeanFactory 抽象类继承 DefaultSingletonBeanRegistry 实现类,中间加一层 FactoryBeanRegistrySupport 抽象类
    • 它处理关于 FactoryBean 对象的注册管理
  • FactoryBeanRegistrySupport 不实现 FactoryBean 接口,仅是依赖它

5. 我的代码结构

1. 整体设计结构

2. 我的调用类图(模拟 Spring 源码)

3. 我的代码结构(模拟 Spring 源码)


相关文章:

手写简易 Spring(三)

文章目录 三. 手写简易 Spring(三)1. Bean 对象初始化和销毁方法1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁3. DefaultSingletonBeanRegistry 优秀的解耦方法 2. 定…...

设计模式-看懂UML类图和时序图

这里不会将UML的各种元素都提到,只讲类图中各个类之间的关系; 能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对 日常的工作和交流; 同时,应该能将类图所表达的含义和最终的代码对应起来; 1…...

2023年全国最新安全员精选真题及答案57

百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 101.(单选题)遇有()及以上强风、浓雾等…...

数字图像处理基础

图像增强:不论方法,只要能够得到较好的图像即可 图像复原:找到图像退化的原因,把噪声过滤得到较好的图像 RGB——HSI(色调 饱和度 亮度)彩色图像处理需要用到灰度图像处理 直方图均衡,灰度概率密度函数接近均匀分布&a…...

onnx手动操作

使用onnx.helper可以进行onnx的制造组装操作: 对象描述ValueInfoProto 对象张量名、张量的基本数据类型、张量形状算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)GraphProto对象用张量节点和算子节点组成的计算图对象ModelP…...

虚拟机安装Centos7,ping不通百度

虚拟机安装Centos7,ping不通百度 一、虚拟机网络配置 网络适配器选择桥接模式,不勾选复制物理网络连接状态。 同时虚拟机使用默认配置都是桥接。 二、配置静态IP 1、首先,查看宿主机的IP和网关 2、配置静态ip的文件地址及修改命令如下&…...

leetCode算法第一天

今天开始刷算法题,提升自己的算法思维和代码能力,加油! 文章目录 无重复字符的最长子串最长回文子串N形变换字符串转换整数 无重复字符的最长子串 leetCode链接 https://leetcode.cn/problems/longest-substring-without-repeating-characte…...

怎么将太大的word文档压缩变小,3个高效方法

怎么将太大的word文档压缩变小?word文档是我们在办公中使用较多的文件格式之一,相信小伙伴们会遇到这样的问题,编辑完成word文档之后发现,编辑完的文档体积太大了,无论是发送给客户还是上传到邮箱中都不方便&#xff0…...

mvc+动态代理

不使用MVC的时候系统存在的缺陷 一个Servlet都负责了那些工作? 负责了接收数据负责了核心的业务处理负责了数据表中的CRUD负责了页面的数据展示… 分析银行转账项目存在那些问题? 代码的复用性太差。(代码的重用性太差) 因为没…...

vue-cli(vue脚手架方式搭建)

1.首先安装node前端环境,可以帮助我们去下载其他的组件 下载完成后,去自己的电脑找到node的文件路径,复制去配置环境变量,在path中配 环境搭配完成后,在cmd中进行测试 ,输入一下两个命令进行测试 2.在hbuilderX中创建一个vue-cli项目(标准的前段项目) 3.组件路由 (1)安装 v…...

CentOS 安装 Docker

文章目录 一、更新yum源二、查看docker是否曾经安装过三、安装所需要的软件包四、设置yum源(也可以设置成国内的阿里源等)五、查看docker版本六、.安装docker (默认全部选y)七、查看docker安装版本八、docker 启动/停止/重启/开机…...

别搞了 软件测试真卷不动了...

内卷可以说是 2022年最火的一个词了。2023 年刚开始,在很多网站看到很多 软件测试的 2022 年度总结都是:软件测试 越来越卷了(手动狗头),2022 年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员带头“…...

OJ刷题 第十二篇

21308 - 特殊的三角形 时间限制 : 1 秒 内存限制 : 128 MB 有这样一种特殊的N阶的三角形&#xff0c;当N等于3和4时&#xff0c;矩阵如下&#xff1a; 请输出当为N时的三角形。 输入 输入有多组数据&#xff0c;每行输入一个正整数N&#xff0c;1<N<100 输出 按照给出…...

【计算机专业应届生先找培训还是先找个工作过渡一下?】

计算机专业应届生先找培训还是先找个工作过渡一下&#xff1f; 计算机应届生是先培训还是先工作&#xff0c;这个问题应该困扰了很多专业技能一般的同学&#xff0c;尤其是学历方面还没有优势的普通本专科院校。都说技术与学历优秀的人进大厂&#xff0c;技术一般学历优秀的人能…...

MySQL数据库,联合查询

目录 1. 联合查询 1.1 内查询 1.2 外查询 1.3 自连接 1.4 子查询 1.5 合并查询 1. 联合查询 联合查询&#xff0c;简单的来讲就是多个表联合起来进行查询。这样的查询在我们实际的开发中会用到很多&#xff0c;因此会用笛卡尔积的概念。 啥是笛卡尔积&#xff1f;两张表…...

springboot注解(全)

一、什么是Spring Boot Spring Boot是一个快速开发框架&#xff0c;快速的将一些常用的第三方依赖整合&#xff08;通过Maven子父亲工程的方式&#xff09;&#xff0c;简化xml配置&#xff0c;全部采用注解形式&#xff0c;内置Http服务器&#xff08;Jetty和Tomcat&#xff0…...

进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

目录 1.进制转换必备知识&#xff1a; 1.1 二进制逢2进1 8进制逢8进1 10进制逢10进1 16进制逢16进1 1.2为了区分二、八、十、十六进制&#xff0c;我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换 2.1 二进制转八进制 2.2 八…...

什么是UML?

文章目录 00 | 基础知识01 | 静态建模类图对象图用例图 02 | 动态建模时序图通信图状态图活动图 03 | 物理建模构件图部署图 UML&#xff08;Unified Model Language&#xff09;&#xff0c;统一建模语言&#xff0c;是一种可以用来表现设计模式的直观的&#xff0c;有效的框图…...

5.3 Mybatis映射文件 - 零基础入门,轻松学会查询的select标签和resultMap标签

本文目录 前言一、创建XML映射文件二、MybatisX插件安装三、mapper标签四、select标签UserMapper接口方法UserMapper.xml 五、resultMap标签定义resultMap标签修改select标签 总结 前言 MyBatis的强大在于它的语句映射&#xff0c;它提供了注解和XML映射文件两种开发方式&…...

“华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附获奖论文和python代码实现)

目录 摘 要: 1 问题重述 1.1 问题背景 1.2 问题重述 2 模型假设 3 符号说明...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...