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

第 4 章 Spring IoC容器之BeanFactory

Spring 的 IoC 容器是一个提供 IoC 支持的轻量级容器,除了基本的 IoC 支持,它作为轻量级容器还提供了 IoC 之外的支持。

在这里插入图片描述

Spring 提供了两种容器类型:BeanFactoryApplicationContext

  1. BeanFactory,基础类型 IoC 容器,提供完整的 IoC 服务支持。如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。所以容器启动初始速度较快。
  2. ApplicationContext,在 BeanFactory 基础上构建的相对高级的容器实现,除了 BeanFactory 的所有支持,还提供了其他高级特性,如事件发布、国际化信息支持等。 ApplicationContext 所管理的对象,在该容器启动之后默认全部初始化并绑定完成。

在这里插入图片描述

BeanFactory 肯定会公开一个取得组装完成的对象的方法接口。

public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";Object getBean(String name) throws BeansException;Object getBean(String name, Class requiredType) throws BeansException;/*** @since 2.5*/Object getBean(String name, Object[] args) throws BeansException;boolean containsBean(String name);boolean isSingleton(String name) throws NoSuchBeanDefinitionException;/*** @since 2.0.3*/boolean isPrototype(String name) throws NoSuchBeanDefinitionException;/*** @since 2.0.1*/boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;Class getType(String name) throws NoSuchBeanDefinitionException;String[] getAliases(String name);
}

4.1 拥有 BeanFactory 之后的生活

之前我们的系统业务对象需要自己去“拉”(Pull)所依赖的业务对象,有了 BeanFactory 之类的 IoC 容器之后,需要依赖什么就让 BeanFactory 为我们推过来(Push)过来就行了。

4.2 BeanFactory 的对象注册与依赖绑定方式

4.2.1 直接编码方式

BeanFactory 接口只定义如何访问容器内管理的 Bean 的方法,BeanDefinitionRegistry 才提供 Bean 注册管理的角色。所以 IoC 容器在实现 BeanFactory 的同时,还需要实现 BeanDefinitionRegistry。

每个一个受管的对象,在容器中都会有一个 BeanDefinition 的实例(instance)与之相对应,该 BeanDefinition 的实例负责保存对象的所有必要信息,包括其对应的对象的 class 类型、是否是抽象类、构造方法参数以及其他属性等。当客户端向 BeanFactory 请求相应对象的时候,BeanFactory 会通过这些信息为客户端返回一个完备可用的对象实例。

4.2.2 外部配置文件方式

Spring 的 IoC 容器支持两个配置文件格式:Properties 文件格式和 XML 文件格式。

通常情况下,需要根据不同的外部配置文件格式,给出相应的 BeanDefinitionReader 实现类,由 BeanDefinitionReader 的相应实现类负责将配置文件内容读取并映射到 BeanDefinition,然后将BeanDefinition 注册到一个 BeanDefinitionRegistry,之后,完成 Bean 的注册和加载。

4.2.3 注解方式

适用于 Spring 2.5 以及 Java 5 或者更高版本。

<context:component-scan/>会到指定的包 (package)下面扫描标注有@Component的类,将它们添加到容器进行管理,并根据它们所标注的@Autowired为这些类注入符合条件的依赖对象。

public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("配置文件路径");FXNewsProvider newsProvider = (FXNewsProvider) ctx.getBean("FXNewsProvider");newsProvider.getAndPersistNews();
}

4.3 BeanFactory 的 XML 之旅

4.3.1 和
4.3.2 孤孤单单一个人
4.3.3 Help Me, Help You
4.3.4 继承?我也会!
<bean id="superNewsProvider" class="..FXNewsProvider"><property name="newsListener"><ref bean="djNewsListener"/></property><property name="newPersistener"><ref bean="djNewsPersister"/></property>
</bean>
<bean id="subNewsProvider" parent="superNewsProvider" class="..SpecificFXNewsProvider"><property name="newsListener"><ref bean="specificNewsListener"/></property>
</bean>

我们在声明 subNewsProvider 的时候,使用了 parent 属性,将其值指定为 superNewsProvider,这样就继承了 superNewsProvider 定义的默认值。

<bean id="newsProviderTemplate" abstract="true"><property name="newPersistener"><ref bean="djNewsPersister"/></property>
</bean><bean id="superNewsProvider" parent="newsProviderTemplate" class="..FXNewsProvider"><property name="newsListener"><ref bean="djNewsListener"/></property> 
</bean><bean id="subNewsProvider" parent="newsProviderTemplate" class="..SpecificFXNewsProvider"><property name="newsListener"><ref bean="specificNewsListener"/></property>
</bean>

newsProviderTemplate 的 bean 定义通过 abstract 属性声明为 true,说明这个 bean 定义不需要实例化,也是可以不指定 class 属性的少数场景之一。

默认情况下,ApplicationContext 会在容器启动的时候就对其管理的所有 bean 进行实例化,只有标志为 abstract 的 bean 除外。

4.3.5 bean 的 scope

scope 用来场景容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其相应的 scope 之前,生成并装配这些对象,在该对象不再处于这些 scope 的限定之后,容器通常会销毁这些对象。

  1. singleton:默认 scope,标记为 singleton 的 bean 对象,在容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化之后,将一直存活到容器退出,也就是说,它与 IoC 容器“几乎”拥有相同的“寿命”。
  2. prototype:对于标记为 prototype 的 bean 对象,容器在接到该类型对象的请求的时候,每次都会重新生成一个新的对象实例给请求方。之后容器便不再拥有当前返回对象的引用,任由其“自生自灭”。
  3. request、session 和 global session:只适用于 Web 应用程序。
  4. 自定义 scope: 实现 org.springframework.beans.factory.config.Scope 接口。
4.3.6 工厂方法与 FacatoryBean

4.4 容器背后的秘密

4.4.1 “战略性观望”

在这里插入图片描述

1. 容器启动阶段

容器启动伊始,首先会通过某种途径加载 Configuration MetaData。除了代码方式比较直接,在大部分情况下,容器需要依赖某些工具类(BeanDefinitionReader)对加载的 Configuration MetaData 进行解析和分析,并将分析后的信息编组为相应的 BeanDefinition。最后把这些保存了 bean 定义必要信息的 BeanDefinition,注册到相应的 BeanDefinitionRegistry,这样容器启动工作就完成了。

2. Bean 实例化阶段

经过第一阶段,现在所有的 bean 定义信息都通过 BeanDefinition 的方式注册到了 BeanDefinitionRegistry 中。当某个请求方通过容器的 getBean 方法明确地请求某个对象,或者因依赖关系容器需要隐式地调用 getBean 方法时,就会触发第二阶段的活动。
该阶段,容器会首先检查所请求的对象之前是否已经初始化。如果没有,则会根据注册的BeanDefinition所提供的信息实例化被请求对象,并为其注入依赖。如果该对象实现了某些回调接口,也会根据回调接口的要求来装配它。当该对象装配完毕之后,容器会立即将其返回请求方使用。

4.4.2 插手“容器的启动”

BeanFactoryPostProcessor,允许我们在容器实例化相应对象之前,对注册到容器的 BeanDefinition 所保存的信息做相应的修改。

4.4.3 了解 bean 的一生

在这里插入图片描述

1. Bean 的实例化 与 BeanWrapper

容器在内部实现时,采用“策略模式(Strategy Pattern)”来决定采用何种方式初始化 bean 实例。通常可以通过反向或者 CGLIB 动态字节码生成来初始化相应的 bean 实例或者动态生成其子类。默认采用 CglibSubclassingInstantiationStrategy 生成对象经过“点缀”过的 BeanWrapper 实例。

2. 各色的 Aware 接口

当对象实例化完成并且相关属性以及依赖设置完成之后,Spring 容器会检查当前对象实例是否实现了一系列的以 Aware 命令结尾的接口定义。如果是,则将这些 Aware 接口定义中规定的依赖注入给当前对象实例。

3. BeanPostProcessor

BeanPostProcessor 会处理容器内所有符合条件的实例化后的对象实例。

4. 自定义 BeanPostProcessor

5. InitializingBean 和 init-method

6. DisposableBean 与 destory-method

4.5 小结

相关文章:

第 4 章 Spring IoC容器之BeanFactory

Spring 的 IoC 容器是一个提供 IoC 支持的轻量级容器&#xff0c;除了基本的 IoC 支持&#xff0c;它作为轻量级容器还提供了 IoC 之外的支持。 Spring 提供了两种容器类型&#xff1a;BeanFactory 和 ApplicationContext&#xff1a; BeanFactory&#xff0c;基础类型 IoC 容…...

滚雪球学Oracle[2.3讲]:Oracle Listener配置与管理

全文目录&#xff1a; 前言一、Oracle Listener的基础概念1.1 什么是Oracle Listener&#xff1f;Listener的作用&#xff1a; 1.2 Oracle Listener的配置文件示例listener.ora配置文件&#xff1a; 1.3 启动与管理Listener 二、多Listener配置与负载分担2.1 多Listener的应用场…...

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受居民的喜爱&#xff0c;社区互助服务管理系统小程序被居民普遍使用&#xff0c;为…...

成都睿明智科技有限公司抖音电商新蓝海的领航者

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业正以惊人的速度迭代升级&#xff0c;而抖音电商作为新兴势力&#xff0c;更是凭借其庞大的用户基数、精准的算法推荐和高度互动的社区氛围&#xff0c;成为了众多商家竞相追逐的蓝海市场。在这片充满机遇与挑战的海洋中&…...

不可错过!CMU最新《生成式人工智能大模型》课程:从文本、图像到多模态大模型

1. 课程简介 从生成图像和文本到生成音乐和艺术&#xff0c;生成模型一直是人工智能的关键挑战之一。本课程将探讨推动生成模型和基础模型&#xff08;Foundation Models&#xff09;最近进展的机器学习和人工智能技术。学生将学习、开发并应用最先进的算法&#xff0c;使机器…...

重庆数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

重庆作为西南地区的重要工业基地&#xff0c;正积极探索和实践数字孪生、工业互联网及可视化技术在智能制造领域的深度融合&#xff0c;致力于打造新型工业化智能制造工厂&#xff0c;为制造业的高质量发展注入强劲动力。 在重庆的智能制造工厂中&#xff0c;数字孪生技术被广…...

Qt QPushButton clicked信号浅析

前言 Qt 的 QPushButton clicked 信号原型&#xff1a; void clicked(bool checked false);通常&#xff0c;使用 Qt 的 QPushButton clicked 点击信号时&#xff0c;会以如下方式使用&#xff1a; connect(ui->pushButton, &QPushButton::clicked, this, [](){qDeb…...

Python时间戳转日期

在Python中&#xff0c;你可以使用datetime模块将时间戳转换为日期。时间戳通常是一个表示自1970年1月1日&#xff08;UTC&#xff09;以来的秒数的浮点数或整数。 以下是一个简单的示例&#xff0c;展示了如何将时间戳转换为日期和时间&#xff1a; import datetime# 示例时…...

对 LLM 工具使用进行统一

我们为 LLM 确立了一个跨模型的 统一工具调用 API。有了它&#xff0c;你就可以在不同的模型上使用相同的代码&#xff0c;在 [Mistral] 或 [Llama]) 等模型间自由切换&#xff0c;而无需或很少需要根据模型更改工具调用相关的代码。此外&#xff0c;我们还在 transformers 中新…...

webpack/vite的区别

Webpack和Vite都是前端开发中常用的构建工具&#xff0c;它们在多个方面存在显著的区别。以下是对这两个构建工具的详细比较&#xff1a; 一、基础概念与定位 Webpack Webpack是一个现代JavaScript应用程序的静态模块打包器&#xff08;module bundler&#xff09;。它允许开发…...

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…...

使用Python实现无人机路径规划的灰狼优化算法

目录 使用 Python 实现无人机路径规划的灰狼优化算法引言1. 灰狼优化算法概述1.1 定义1.2 算法原理1.3 灰狼的狩猎策略1.4 算法步骤 2. Python 中的灰狼优化算法实现2.1 安装必要的库2.2 定义类2.2.1 灰狼类2.2.2 群体类2.2.3 路径规划类 2.3 示例程序 3. 灰狼优化算法的优缺点…...

理解递归和回溯

文章目录 什么是递归回溯 什么是递归 回溯 //使用递归回溯来给小球找路//说明//1. map 表示地图//2. i,j 表示从地图的哪个位置开始出发 (1,1)//3. 如果小球能到 map[6][5] 位置&#xff0c;则说明通路找到.//4. 约定&#xff1a; 当map[i][j] 为 0 表示该点没有走过 当为 1 表…...

知识图谱入门——3:工具分类与对比(知识建模工具:Protégé、 知识抽取工具:DeepDive、知识存储工具:Neo4j)

在知识图谱构建的过程中&#xff0c;针对不同的任务和需求&#xff0c;我们可以使用多种工具。为了帮助你快速选择合适的工具&#xff0c;本文将常用工具按类别进行分类介绍&#xff0c;并对比其优缺点&#xff0c;方便你在不同场景中做出最佳选择。 文章目录 1. 知识建模工具…...

使用指标进行量化交易时,有哪些需要注意的风险点呢

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

数据结构阶段测试2的一点小补充

数据结构阶段测试2的一点小补充 1.已知⼩根堆为8,15,10,21,34,16,12&#xff0c;删除关键字8之后需重建堆&#xff0c;最后的叶⼦ 节点为() A. 34 B. 21 C. 16 D. 12 解题思路 向下调整算法删除堆顶元素 &#x1f4a1; 答案&#xff1a;C 删除堆顶元素的思路&#xff1a; …...

量化交易里面的挂单成交率大概是多少呢

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

【Android 14源码分析】Activity启动流程-3

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…...

Javascript客户端时间与服务器时间

在Java代码中使用new Date()&#xff0c;获取的是本机时间&#xff1b; 但是在Javascript 中使用new Date()&#xff0c;获取的却是访问该页面的客户端时间。 这样&#xff0c;就可能会出现一个问题&#xff1a;我的电脑时间比正常时间要快&#xff0c;我访问一个页面&#x…...

系统架构设计师教程 第11章 11.4 边缘计算概述 笔记

11.4 边缘计算概述 ★★☆☆☆ 11.4.1 边缘计算概念 边缘计算将数据的处理、应用程序的运行甚至一些功能服务的实现&#xff0c;由 网络中心下放到网络边缘的节点上。在网络边缘侧的智能网关上就近采集并且处理数据&#xff0c;不需要上传原生数据。 11.4.2 边缘计算的定义 1…...

ARM MHU寄存器架构与核间通信优化指南

1. ARM MHU寄存器架构概述在ARM多核处理器架构中&#xff0c;MHU&#xff08;Message Handling Unit&#xff09;是实现核间通信的关键硬件模块。作为专门优化的消息传递单元&#xff0c;MHU通过精心设计的寄存器组实现了高效的数据传输和中断管理机制。不同于传统的共享内存通…...

攻防演练:Ettercap 实战中间人攻击与防御指南

1. 认识Ettercap&#xff1a;网络攻防的双刃剑 第一次接触Ettercap是在2015年的一次企业内网渗透测试中。当时我们需要模拟黑客攻击路径&#xff0c;测试公司内部网络的安全性。这个看起来其貌不扬的命令行工具&#xff0c;只用了几条简单的ARP欺骗命令&#xff0c;就成功劫持了…...

百度网盘直链解析工具:告别限速,3分钟实现全速下载!

百度网盘直链解析工具&#xff1a;告别限速&#xff0c;3分钟实现全速下载&#xff01; 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘那令人抓狂的下载速度而…...

算法工程师简历封神指南:项目细节 + 论文 / 竞赛成果缺一不可

引言:算法岗简历的“死亡三连”,你中了吗? “熟悉CNN、Transformer、大模型微调,掌握PyTorch、TensorFlow”——当面试官第88次看到这句“算法词典式”技能描述时,已经开始默默划走简历。2026年算法岗卷到什么程度?智联招聘数据显示,硕士学历算法岗平均竞争比达300:1,…...

网站建设公司推荐:业内公认高水准网站制作公司一览

在数字化竞争日益激烈的2026年&#xff0c;企业官网已从单纯的信息展示窗口升级为品牌战略核心载体与业务增长引擎。面对市场上众多的网站建设服务商&#xff0c;企业如何精准匹配需求&#xff1f;本文作为第三方深度测评&#xff0c;从高端定制、模板建站、低成本快速上线三类…...

【亲测免费】 CISP-DSG 数据安全培训教材课件标准版

CISP-DSG 数据安全培训教材课件标准版 【下载地址】CISP-DSG数据安全培训教材课件标准版 本仓库提供的是“注册数据安全治理专业人员”&#xff08;Certified Information Security Professional - Data Security Governance&#xff0c;简称 CISP-DSG&#xff09;的培训教材课…...

clj-kondo Hook系统完全指南:自定义宏和函数的智能分析

clj-kondo Hook系统完全指南&#xff1a;自定义宏和函数的智能分析 【免费下载链接】clj-kondo Static analyzer and linter for Clojure code that sparks joy 项目地址: https://gitcode.com/gh_mirrors/cl/clj-kondo clj-kondo 是一款为 Clojure 代码提供静态分析和 …...

从HelloWorld到真实机器人:Fast DDS QoS策略实战指南(以导航数据发布为例)

从HelloWorld到真实机器人&#xff1a;Fast DDS QoS策略实战指南&#xff08;以导航数据发布为例&#xff09; 在机器人开发领域&#xff0c;数据传输的可靠性和实时性直接关系到系统的稳定性和安全性。当你的机器人从实验室demo走向真实场景时&#xff0c;简单的HelloWorld示例…...

锂离子动力电池机理建模与系统状态评估【附代码】

✨ 长期致力于新能源汽车、动力电池系统、状态监测与评估、Matlab/Simulink研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;全阶电化学-热耦合模型的有…...

车间违规操作难监管?AI Box 智能视频监控系统解决方案

干工控这么多年&#xff0c;我最不愿意看到的就是安全事故。每次听到哪个工厂出了安全事故&#xff0c;心里都特别难受。其实很多安全事故都是因为违规操作引起的&#xff0c;比如不戴安全帽、不系安全带、在车间吸烟等等。传统的监控只能事后追溯&#xff0c;不能事前预警&…...