Spring中的Bean和Bean的生命周期
在Spring中,Bean是被管理的对象,是应用程序的基本组件。Bean的生命周期包括Bean的创建、初始化、使用和销毁。在本文中,我们将介绍Spring中Bean的概念,如何创建和管理Bean以及Bean的生命周期。
Bean的概念
在Spring中,Bean是一个被Spring IOC容器管理的对象。通常情况下,一个Java类会被声明为一个Bean,以便Spring能够将其实例化、配置和管理。Spring中的Bean是一个实例对象,这个对象被包装在Spring IOC容器中,因此可以在整个应用程序中使用。
在Spring中,Bean可以是任何Java对象,包括简单的Java类、POJO、JavaBean和EJB等。在定义Bean时,需要指定Bean的唯一标识符,这个标识符在整个应用程序中必须是唯一的。
Bean的创建
在Spring中,Bean的创建过程通常分为两个阶段:Bean的实例化和Bean的初始化。实例化是指创建Bean的一个实例对象,而初始化则是指对这个实例对象进行配置和初始化。
Bean的生命周期
在 Spring 容器中,每个 Bean 都有一个完整的生命周期,即从实例化、依赖注入,到销毁的过程,Spring 容器为我们管理了这些过程。接下来我们将对 Bean 的生命周期进行详细的介绍。
Bean 的实例化
Bean 的实例化是指容器创建 Bean 的实例,这是 Bean 生命周期的第一个阶段。
Bean 的实例化可以通过两种方式实现:一种是使用默认的无参构造函数实例化 Bean,另一种是使用工厂方法实例化 Bean。
使用默认构造函数实例化 Bean
默认情况下,Spring 容器会调用 Bean 的默认构造函数来实例化 Bean。示例如下:
public class ExampleBean {// 默认构造函数public ExampleBean() {// ...}
}
使用工厂方法实例化 Bean
除了使用默认的构造函数来实例化 Bean,还可以使用工厂方法来实例化 Bean。示例如下:
public class ExampleBean {private String name;// 工厂方法public static ExampleBean createExampleBean() {ExampleBean exampleBean = new ExampleBean();exampleBean.setName("exampleBean");return exampleBean;}// setter 和 getter 方法public void setName(String name) {this.name = name;}public String getName() {return name;}
}
Bean 的属性注入
Bean 的实例化之后,容器会将 Bean 的属性值注入到 Bean 中,这是 Bean 生命周期的第二个阶段。Spring 提供了两种常用方式来实现 Bean 的属性注入:构造函数注入和Setter 方法注入。
构造函数注入
构造函数注入是指通过构造函数来注入 Bean 的属性值,即在创建 Bean 实例时,容器会调用 Bean 的构造函数,并将属性值作为构造函数的参数传入。
示例如下:
public class ExampleBean {private String name;// 有参构造函数public ExampleBean(String name) {this.name = name;}// setter 和 getter 方法public void setName(String name) {this.name = name;}public String getName() {return name;}
}
Setter 方法注入
Setter 方法注入是指通过 Setter 方法来注入 Bean 的属性值,即容器会在实例化 Bean 后,调用 Bean 的 Setter 方法,将属性值作为参数传入。
示例如下:
public class ExampleBean {private String name;// setter 和 getter 方法public void setName(String name) {this.name = name;}public String getName() {return name;}
}
Bean后置处理器
在Bean的生命周期中,Spring提供了BeanPostProcessor接口,通过实现这个接口的类,可以在Bean初始化前后进行一些操作。BeanPostProcessor接口包括两个方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
其中,postProcessBeforeInitialization()方法在Bean初始化之前被调用,可以在这个方法中对Bean做一些处理,比如代理、修改属性等。postProcessAfterInitialization()方法在Bean初始化之后被调用,也可以在这个方法中对Bean做一些处理,比如添加监听器等。
实现BeanPostProcessor
我们可以创建一个实现了BeanPostProcessor接口的类,在这个类中实现两个方法,并把这个类注册到Spring的容器中,来实现Bean的后置处理器。
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof UserService) {System.out.println("Before initialization of UserService: " + beanName);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof UserService) {System.out.println("After initialization of UserService: " + beanName);}return bean;}
}
在这个实现类中,我们可以看到两个方法的实现,这里我们只是简单地打印一下日志,以便在Bean初始化前后可以看到效果。接着,我们需要把这个实现类注册到Spring的容器中:
<bean id="myBeanPostProcessor" class="com.example.MyBeanPostProcessor"/>
当然也可以使用注解的方式,将MyBeanPostProcessor放到IOC容器中。
BeanPostProcessor的执行顺序
当一个Bean在容器中被创建的时候,BeanPostProcessor会被依次执行。首先,容器会执行所有实现了BeanFactoryPostProcessor接口的类的方法,然后才会执行所有实现了BeanPostProcessor接口的类的方法。在执行BeanPostProcessor接口的方法时,会先执行所有实现了PriorityOrdered接口的类的方法,然后执行所有实现了Ordered接口的类的方法,最后执行其他实现了BeanPostProcessor接口的类的方法。在BeanPostProcessor接口的实现类中,我们可以通过实现Ordered或PriorityOrdered接口,来改变BeanPostProcessor的执行顺序。
总结
本文介绍了Spring中Bean的概念以及Bean的生命周期,包括Bean的实例化、属性赋值、初始化、销毁等过程,以及如何通过实现BeanPostProcessor接口来对bean的创建过程进行扩展,实现我们自定义的一些行为。
相关文章:
Spring中的Bean和Bean的生命周期
在Spring中,Bean是被管理的对象,是应用程序的基本组件。Bean的生命周期包括Bean的创建、初始化、使用和销毁。在本文中,我们将介绍Spring中Bean的概念,如何创建和管理Bean以及Bean的生命周期。 Bean的概念 在Spring中࿰…...
嘉兴桐乡技能培训提升-如何提高工作效率
现在的工作基本上都离不开电脑,所以大家几乎天天都在跟电脑打交道,那么这些电脑使用技巧你知道多少呢?今天桐乡办公软件培训沈老师就给大家分享一下: 如何让“自动更正”输入统一的文本 你是不是经常为输入某些固定的文本&#x…...

SystemFunction032函数的免杀研究
什么是SystemFunction032函数? 虽然Benjamin Delphi在2013年就已经在Mimikatz中使用了它,但由于我之前对它的研究并不多,才有了下文。 这个函数能够通过RC4加密方式对内存区域进行加密/解密。例如,ReactOS项目的代码中显示&…...

Shell函数
目录 1.Shell的作用 2.Shell函数定义 3.函数变量的作用范围 Source 4.递归 5.函数库 编辑编辑编辑 1.Shell的作用 使用函数可以避免代码重复 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强 2.Shell函数定义 1) functi…...
Spring-IOC源码解析
容器创建过程 Spring容器的refresh方法 public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh");// 1. 进行创…...

不会做大数据实时计算?10年数据分析师整理,一文给出解决方案
本文分为四个章节介绍实时计算,第一节介绍实时计算出现的原因及概念;第二节介绍实时计算的应用场景;第三节介绍实时计算常见的架构;第四节是实时数仓解决方案。 一、实时计算 实时计算一般都是针对海量数据进行的,并…...

如何让你的 WebSocket 接口测试更高效?拯救你的接口测试工作
目录 引言 WebSocket介绍 HTTP与WebSocket的区别 WebSocket测试方法 使用在线工具 使用Postman 使用Jmeter 使用Python 结语 引言 你是否曾经为 WebSocket 接口测试中复杂的协议和难以捕获的数据而感到束手无策?WebSocket 协议与传统的 HTTP 协议不同&…...
浅谈Linux 文件系统层次结构的组织方式
Linux 文件系统层次结构(Filesystem Hierarchy Standard,简称 FHS)是一种用于组织和管理 Linux 文件系统的标准化方式。该标准规定了 Linux 文件系统中各个目录和文件的组织方式、用途和权限,以提高文件系统的可读性、可维护性和可…...

创新案例 |探索 Tive 80% 的收入增长得益于智能物流服务、跟踪和实时可视化
您正在寻找可靠的物流解决方案吗? Tive 是领先的智能物流服务提供商,提供跟踪和实时可见性解决方案。使用 Tive,您可以主动监控公路、空运、海运和铁路运输。它可以帮助您减少运输问题并确保准时和全面交付,从而改善客户体验。 …...
makefile和cmake
Makefile 是一种文件,它定义了一个项目中的编译规则、依赖关系和构建过程。Makefile 可以自动化地构建和管理项目,使得整个项目的构建过程更加高效和可靠。下面是 Makefile 的常用语法: 1. 定义变量 变量可以用来保存一些常用的参数和路径&…...
通过OpenCL内核代码猜测设备寄存器个数
在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询。而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因此我这边提供一个比较基本的方法来猜测当前计…...
C# + .Net6 实现TensorFlow图片分类
微软官网上发现一篇很有意思的文档:教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn 这篇教程写的很学院派,但有点碎,属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码:samples/Pro…...
Ngnix负载均衡和高可用集群及搭建与相关理论
Ngnix负载均衡和高可用集群及搭建与相关理论 全文目录 Ngnix负载均衡和高可用集群及搭建与相关理论高可能保持原理配置 keepalived:配置keepalived的IP将外部域名解析到Keepalived的虚拟IP上如何验证配置的正确性Nginx专用调试工具ngx_conf_t如何对前后端多台服务器…...

2022年宜昌市网络搭建与应用竞赛样题(三)
网络搭建与应用竞赛样题(三) 技能要求 (总分1000分) 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分࿰…...

为什么PCB设计完成后需要放置mark点
PCB设计中的Mark点是指一些标记点,通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位,从而确保所有部件都被正确组装到其正确位置,这对于确保产品的质量和可靠性至关重要。 下面&#…...
代理IP:IP代理技术与Socks5协议
代理IP是一种用于隐藏真实IP地址的技术,它可以将请求发送至代理服务器,再由代理服务器转发请求至目标网站。代理服务器会在请求过程中替换真实IP地址,从而保护用户的隐私和安全。在网络爬虫、反爬虫、匿名访问等场景中,代理IP技术…...
如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面
今天我想和大家聊聊程序员职业发展的问题。相信大家都知道,IT公司因为各种原因裁员,对程序员的前途发展都是不利的。特别是等到你30多岁,上有老下有小,仍然要加班,与年轻人竞争体力和智力,这是很艰难的。如…...

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录&a…...

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!
前言 ChatGPT由于在访问上有一些限制,使用并不便利。目前国内可以直接访问的大部分是调用API返回结果,我们去使用时总会有次数限制,而且它们可能随便崩掉。 其实,目前我们访问过的大部分国内的网页包括UI,其实是套用了…...

自学黑客(网络安全),一般人我劝你还是算了吧
一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...

【Elasticsearch基础】Elasticsearch批量操作(Bulk API)深度解析与实践指南
目录 1 Bulk API概述 1.1 什么是批量操作 1.2 Bulk API的优势 2 Bulk API的工作原理 2.1 请求处理流程 2.2 底层机制 3 Bulk API的使用方法 3.1 基本请求格式 3.2 操作类型示例 3.3 响应格式 4 Bulk API的最佳实践 4.1 批量大小优化 4.2 错误处理策略 4.3 性能调…...

MTK-Android12-13 Camera2 设置默认视频画质功能实现
MTK-Android12-13 Camera2 设置默认视频画质功能实现 场景:部分客户使用自己的mipi相机安装到我们主板上,最大分辨率为1280720,但是视频画质默认的是640480。实际场景中,在默认视频分辨率情况下拍出来的视频比较模糊、预览也不清晰…...
GitHub 趋势日报 (2025年06月07日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 603 netbird 459 dify 440 cognee 352 omni-tools 337 note-gen 239 ragbits 237 …...

【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示
文章目录 前言1. Docker 是什么?2. 为什么要使用 Docker? 安装 Docker1. 安装 Docker Desktop2. 安装 OrbStack3. Docker Desktop VS OrbStack5. 验证安装 使用 Docker 运行项目1. 克隆项目到本地2. 进入项目目录3. 启动容器: 查看运行效果1. OrbStack 中…...

LangGraph--Agent工作流
Agent的工作流 下面展示了如何创建一个“计划并执行”风格的代理。 这在很大程度上借鉴了 计划和解决 论文以及Baby-AGI项目。 核心思想是先制定一个多步骤计划,然后逐项执行。完成一项特定任务后,您可以重新审视计划并根据需要进行修改。 般的计算图如…...

数学:”度量空间”了解一下?
度量空间是现代数学中一种基本且重要的抽象空间。以下是对它的详细介绍: 定义 相关概念 常见的度量空间举例 度量空间的类型 度量空间的作用 度量空间是拓扑空间的一种特殊情况,它为拓扑空间的研究提供了具体的模型和实例。同时,度量空间在…...