设计模式实战:自定义SpringIOC(理论分析)

自定义SpringIOC(理论分析)

上一篇:设计模式开源实战:观察者模式不知道怎么用?手撕Spring源码中跟着大佬学编程

上一篇我们研究了大佬在Spring源码中使用的观察者模式,今天我们再来聊聊Spring的核心功能——Sping IOC容器,最终我们跟着大佬的思路实现一个属于自己的IOC容器!Start Go!

Spring IOC核心组件

1) BeanFactory

BeanFactory作为最顶层的一个接口,定义了IoC容器的基本功能规范。
在这里插入图片描述
从类图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,它实现了所有的接口。那么为何要定义这么多层次的接口呢?
每个接口都有它的使用场合,主要是为了区分在 Spring 内部操作过程中对象的传递和转化,对对象的数据访问所做的限制。

例如,

  • ListableBeanFactory接口表示这些 Bean 可列表化。
  • HierarchicalBeanFactory表示这些 Bean 是有继承关系的,也就是每个 Bean 可能有父 Bean
  • AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。

这三个接口共同定义了 Bean 的集合、Bean 之间的关系及 Bean 行为。

在 BeanFactory 里只对 IOC 容器的基本行为做了定义,根本不关心你的 Bean 是如何定义及怎样加载的。正如我们只关心能从工厂里得到什么产品,不关心工厂是怎么生产这些产品的。

2 ) ApplicationContext

BeanFactory 有一个很重要的子接口,就是 ApplicationContext 接口,该接口主要来规范容器中的 bean 对象是非延时加载,即在创建容器对象的时候就对象 bean 进行初始化,并存储到一个容器中。

//延时加载
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("bean.xml"));//立即加载
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user", User.class);

ApplicationContext 的子类主要包含两个方面:

  • ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息

  • WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext,通常情况下,这个接口使用少

要知道工厂是如何产生对象的,我们需要看具体的 IOC 容器的实现,Spring 提供了许多 IOC 容器实现,比如:

  • ClasspathXmlApplicationContext : 根据类路径加载 xml 配置文件,并创建 IOC 容器对象。
  • FileSystemXmlApplicationContext :根据系统路径加载 xml 配置文件,并创建 IOC 容器对象。
  • AnnotationConfigApplicationContext :加载注解类配置,并创建 IOC 容器。

在这里插入图片描述
总体来说 ApplicationContext 必须要完成以下几件事。

  • 标识一个应用环境
  • 利用 BeanFactory 创建 Bean 对象
  • 保存对象关系表
  • 能够捕获各种事件

3) Bean定义:BeanDefinition

这里的 BeanDefinition 就是我们所说的 Spring 的 Bean,我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {//DefaultListableBeanFactory 中使用 Map 结构保存所有的 BeanDefinition 信息private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); 
}   

BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。

4) BeanDefinitionReader

Bean 解析过程非常复杂,功能被分得很细,因为这里需要被扩展的地方很多,必须保证足够的灵活性,以应对可能的变化。Bean的解析主要就是对 Spring 配置文件的解析。

这个解析过程主要通过 BeanDefinitionReader 来完成,看看 Spring 中 BeanDefinitionReader 的类结构图,如下图所示。
在这里插入图片描述
BeanDefinitionReader 接口定义的功能

public interface BeanDefinitionReader {/*下面的loadBeanDefinitions都是加载bean定义,从指定的资源中*/int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;
}

5) BeanFactory后置处理器

后置处理器是一种拓展机制,贯穿Spring Bean的生命周期

后置处理器分为两类:

BeanFactory后置处理器:BeanFactoryPostProcessor

实现该接口,可以在spring的bean创建之前,修改bean的定义属性
在这里插入图片描述

public interface BeanFactoryPostProcessor {/**  该接口只有一个方法postProcessBeanFactory,方法参数是ConfigurableListableBeanFactory,通过该参数,可以获取BeanDefinition*/void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

6) Bean后置处理器:BeanPostProcessor

BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口

实现该接口,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些处理逻辑
在这里插入图片描述

public interface BeanPostProcessor {//bean初始化方法调用前被调用Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;//bean初始化方法调用后被调用Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

IOC流程图

在这里插入图片描述

  1. 容器环境的初始化(系统、JVM 、解析器、类加载器等等)
  2. Bean 工厂的初始化( IOC 容器首先会销毁旧工厂,旧 Bean 、创建新的工厂)
  3. 读取:通过 BeanDefinitonReader 读取我们项目中的配置(application.xml)
  4. 定义:通过解析 xml 文件内容,将里面的 Bean 解析成 BeanDefinition(未实例化、未初始化)
  5. 将解析得到的 BeanDefinition ,存储到工厂类的Map容器中
  6. 调用 BeanFactoryPostProcessor 该方法是一种功能增强,可以在这个步骤对已经完成初始化的 BeanFactory 进行属性覆盖,或是修改已经注册到 BeanFactory 的 BeanDefinition
  7. 通过反射实例化 bean 对象
  8. 进入到 Bean 实例化流程,首先设置对象属性
  9. 检查 Aware 相关接口,并设置相关依赖
  10. 前置处理器,执行 BeanPostProcesser 的before 方法对 bean 进行扩展
  11. 检查是否有实现 initializingBean 回调接口,如果实现就要回调其中的 AftpropertiesSet() 方法,(通过可以完成一些配置的加载)
  12. 检查是否有配置自定义的 init-method ,
  13. 后置处理器执行 BeanPostProcesser 的after 方法 --> AOP 就是在这个阶段完成的, 在这里判断 bean 对象是否实现接口,实现就使用 JDK 代理,否则选择 CGLIB
  14. 对象创建完成,添加到BeanFactory的单例池中。

往期回顾

设计模式开源实战:观察者模式不知道怎么用?手撕Spring源码中跟着大佬学编程

设计模式开源实战:大佬是怎么使用工厂模式的?来看看Spring中工厂模式的应用就知道了

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

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

相关文章

人工智能如何改变项目管理:应用、影响与趋势

人工智能如何改变项目管理&#xff1a;应用、影响与趋势1. 人工智能如何提升项目规划与进度安排2. 人工智能在资源分配与优化中的应用3. 人工智能用于风险管理4. 人工智能用于团队协作与交流5. 人工智能用于项目监控与报告6. 集成人工智能的项目管理软件6.1 Wrike6.2 ClickUp6.…

【MySql】事务的原理

​ 【MySql】事务的原理数据库的隔离级别原理读未提交读已提交可重复读&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔离级别&#xff0c;强制事务串行执行&#xff0c;避免了所有并发问题&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目标检测基础

一、基本认知1.1目标检测的定义目标检测&#xff08;Object Detection&#xff09;&#xff1a;在图像或视频中检测出目标图像的位置&#xff0c;并进行分类和识别的相关任务。主要是解决图像是什么&#xff0c;在哪里的两个具体问题。1.2使用场景目标检测的使用场景众多&#…

GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【四】

沿袭我们的月度发布传统&#xff0c;极狐GitLab 发布了 18.2 版本&#xff0c;该版本带来了议题和任务的自定义工作流状态、新的合并请求主页、新的群组概览合规仪表盘、下载安全报告的 PDF 导出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等几十个重点功能的改进…

Python----大模型(大模型微调--BitFit、Prompt Tuning、P-tuning、Prefix-tuning、LORA)

一、大模型微调 1.1、解释 微调(Fine-tuning)是在预训练大模型基础上&#xff0c;针对特定领域数据进行二次训练的技术过程。这一过程使大型语言模型(如GPT、BERT等)能够更好地适应具体应用场景&#xff0c;显著提升在专业领域的表现。 1.2、微调的基本流程 模型选择&#xf…

本地安装 SQLite 的详细步骤

方法 1:使用预编译二进制文件 下载 SQLite: 访问 SQLite 官方下载页面。 下载 Precompiled Binaries for Windows 中的 sqlite-tools-win32-x86-*.zip。 解压文件: 将下载的 ZIP 文件解压到一个目录(例如 C:\sqlite)。 配置环境变量: 右键「此电脑」→「属性」→ 左侧「高…

专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43444 圈内人都知道&#xff0c;2024年的BioChina展会现场&#xff0c;某跨国药企高管盯着融资展板喃喃自语&#xff1a;“去年A轮平均3.2亿&#xff0c;今年怎么降到2.1亿了&#xff1f;” 这个细节&#xff0c;恰是行业寒冬的缩影…

Chroma安装教程

Chroma 这里讲述的是windows环境 下载Chroma安装包 下载地址&#xff1a;https://github.com/chroma-core/chroma/releases 运行 chroma-windows.exe run --port 8000通过心跳检测访问是否正常 http://localhost:8000/api/v2/heartbeat快速使用 python安装chromadb pyth…

kali Linux 2025.2安装教程(解决安装失败-图文教程超详细)

一&#xff0c;下载镜像&#xff1a; 进入官网&#xff1a;Get Kali | Kali Linux &#xff0c;往下滑 等待两年半&#xff0c;镜像下载好。 二&#xff0c;虚拟机安装&#xff1a; 转&#xff1a;VMware Workstation Pro 17 安装图文教程 知乎平台&#xff1a;VMware Work…

uniapp项目使用ucharts实现折线图详细讲解(案例)

1.在Hbuildx里面的工具>插件安装&#xff0c;进入DCloud搜索uchart 2.点击对应的项目导入该插件 可以看到在该目录下有该插件 3.进入官网演示 - uCharts跨平台图表库&#xff0c;找一个示例代码测试一下&#xff0c;是否可以成功应用 因为这里使用的是vue2&#xff0c;如果你…

数据分析师进阶——95页零售相关数据分析【附全文阅读】

这份资料适合零售行业从业者&#xff0c;尤其是服装销售领域的人员&#xff0c;能帮大家用数据分析提升销售业绩。资料先提出 “店铺 20 问”&#xff0c;引导思考店铺运营问题&#xff0c;接着点明数据分析对提升销售、找出销售不佳原因的重要性 。详细介绍销售业绩相关公式及…

计算机组成原理(6) - 加法器

加法器是数字电路中用于执行加法运算的基本逻辑单元&#xff0c;广泛应用于计算机、计算器、数字信号处理器等电子设备中。它能将两个二进制数相加&#xff0c;并输出结果及可能产生的进位。一、加法器的基本功能加法器的基本功能是在数字电路中对输入的二进制数执行加法运算&a…

Qt 与 WebService 交互开发

在现代软件开发中&#xff0c;WebService 已成为实现跨平台、跨语言通信的重要标准。Qt 作为一个强大的跨平台框架&#xff0c;提供了完善的工具和类库来实现与 WebService 的交互。本文将深入探讨 Qt 与 WebService 交互开发的核心技术和实践经验&#xff0c;包括 SOAP 协议实…

LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案

大语言模型(LLM)的部署一直是工业落地的核心挑战。动辄百亿甚至万亿参数的模型规模,对硬件资源、推理速度和系统稳定性提出了严苛要求。本文将系统剖析 LLM 部署中的关键技术瓶颈,从模型压缩、推理加速到分布式架构设计,提供可落地的工程化解决方案,并附具体实现代码。 …

理解训练深度前馈神经网络的困难—— 解锁深度学习的关键钥匙

2010年&#xff0c;深度学习先驱 Xavier Glorot 和 Yoshua Bengio 发表了这篇里程碑式的论文。它精准地诊断了当时阻碍深度神经网络发展的核心顽疾——**梯度消失/爆炸问题**&#xff0c;并开出了革命性的“药方”&#xff1a;**Xavier/Glorot 初始化**。这篇论文扫清了训练深度…

Objective-c 初阶——异常处理(try-catch)

一、try/catch/throw/finally 执行顺序 void doSomething() {NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init];try {// 这一步抛异常[self riskyMethod]; } catch (NSException *e) {throw; // 把异常继续往上抛} finally {// ❗ 注意&#xff1a;这里的 finally…

计算机网络:(十二)传输层(上)运输层协议概述

计算机网络&#xff1a;&#xff08;十一&#xff09;多协议标记交换 MPLS前言一、运输层的作用二、基于端口的复用和分用功能三、屏蔽作用四、可靠信道与不可靠信道五、运输层的两个主要协议前言 前面我们讲解了计算机网络中网络层的相关知识&#xff0c;包括网络层转发分组的…

一场关于电商零售增长破局的深圳探索

“电商AI&#xff0c;不再是选择题”2025年&#xff0c;电商行业正面临流量成本攀升、用户留存率下降、供应链协同效率低等核心困境&#xff0c;传统数字化工具已难以满足精细化运营需求。在此背景下&#xff0c;百度智能云正加速布局电商领域&#xff0c;为零售企业提供从基础…

当非洲爱上“中国制造”:如何赢在起跑线

非洲大陆的消费浪潮正以前所未有的速度奔涌。2025年前五个月&#xff0c;中非贸易额同比暴涨12.4%&#xff0c;创下历史新高。在这片拥有14亿人口的土地上&#xff0c;60%是30岁以下的年轻人&#xff0c;城镇化浪潮席卷、中产阶级快速崛起&#xff0c;从家电、汽车到建材、电子…

vLLM(3)vllm在线启动集成openweb-ui

文章目录**步骤 1: 启动 vLLM 服务****方式 1: 直接命令行启动****方式 2: Docker 启动****步骤 2: 配置 Open WebUI 连接 vLLM****方法 1: 修改 Open WebUI 环境变量****方法 2: 通过 docker-compose.yml 部署****步骤 3: 在 Open WebUI 中添加模型****验证是否成功****常见问…