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

Spring 之初始化前中后详解

        Spring 框架是一个非常流行的 Java 框架,它提供了一种轻量级的、可扩展的方式来构建企业级应用程序。在 Spring 的生命周期中,有三个重要的阶段,即初始化前、初始化、初始化后。这篇文章将详细介绍这些阶段,并提供相应的源代码示例和扩展点。

初始化前

        在 Spring 框架中,初始化前阶段是指在创建应用程序上下文之前执行的阶段。在这个阶段, Spring 会执行一些配置和准备工作,以确保应用程序上下文在启动时能够正确地初始化。

执行步骤

在初始化前阶段, Spring 框架会执行以下步骤:

加载 Spring 配置文件

在这个阶段, Spring 会加载应用程序的配置文件。这些配置文件包括 XML 文件、 Java 配置类和属性文件等。

创建BeanFactory

在加载配置文件之后, Spring 会创建一个BeanFactory实例。这个实例将会保存应用程序中所有的 bean 定义和 bean 实例。

预处理BeanDefinition

在创建BeanFactory之后, Spring 会预处理所有的 bean 定义。这个过程包括解析所有的 bean 定义,检查它们的依赖关系,并将它们注册到BeanFactory中。

执行BeanFactoryPostProcessor

在预处理所有的 bean 定义之后, Spring 会执行所有注册的BeanFactoryPostProcessor。这些处理器允许开发人员在BeanFactory创建之前修改 bean 定义。

扩展点

在初始化前阶段, Spring 提供了以下扩展点:

BeanFactoryPostProcessor

BeanFactoryPostProcessor 接口允许开发人员在 BeanFactory 创建之前修改 bean 定义。这个接口有一个方法 postProcessBeanFactory,开发人员可以在这个方法中访问并修改BeanFactory。

以下是一个示例:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 在这里修改bean定义}
}

可以在 Spring 的配置文件中注册这个处理器:

<bean class="com.example.MyBeanFactoryPostProcessor"/>

初始化

初始化阶段是指在创建应用程序上下文时执行的阶段。在这个阶段,Spring 会将配置文件中定义的所有 bean 都实例化并注入到它们所依赖的其他 bean 中。

执行步骤

在初始化阶段, Spring 框架会执行以下步骤:

实例化 bean

在这个阶段, Spring 会使用 bean 定义中的信息创建 bean 实例。

设置依赖关系

在实例化 bean 之后, Spring 会注入 bean 所依赖的其他 bean 。这个过程使用属性注入、构造函数注入或方法注入等方式完成。

执行BeanPostProcessor

在设置好 bean 的依赖关系之后, Spring 会执行所有注册的 BeanPostProcessor。这些处理器允许开发人员在 bean 实例化之后修改 bean 。

执行InitializingBean和init-method

在执行完所有的BeanPostProcessor之后, Spring 会执行 InitializingBean 接口的 afterPropertiesSet 方法或者配置文件中指定的 init-method 方法。

扩展点

在初始化阶段, Spring 提供了以下扩展点:

BeanPostProcessor

BeanPostProcessor 接口允许开发人员在 bean 实例化之后修改 bean 。这个接口有两个方法 postProcessBeforeInitializationpostProcessAfterInitialization,分别表示在 bean 初始化前和初始化后执行。

以下是一个示例:

public class MyBeanPostProcessor implements BeanPostProcessor {public Object postProcessBeforeInitialization(Object bean, String beanName) {// 在这里修改beanreturn bean;}public Object postProcessAfterInitialization(Object bean, String beanName) {// 在这里修改beanreturn bean;}
}

可以在 Spring 的配置文件中注册这个处理器:

<bean class="com.example.MyBeanPostProcessor"/>

InitializingBean 和 init-method

InitializingBean 接口和 init-method 方法都允许开发人员在 bean 实例化之后执行一些初始化工作。这些方法在 bean 实例化之后执行,但在BeanPostProcessor之前执行。

以下是一个示例:

public class MyBean implements InitializingBean {public void afterPropertiesSet() throws Exception {// 在这里执行初始化工作}
}

可以在 Spring 的配置文件中使用init-method定义这个初始化方法:

<bean id="myBean" class="com.example.MyBean" init-method="init"/>

初始化后

初始化后阶段是指在所有 bean 都初始化之后执行的阶段。在这个阶段,Spring 会执行一些清理和收尾工作,以确保应用程序上下文在关闭时能够正确地销毁。

执行步骤

在初始化后阶段, Spring 框架会执行以下步骤:

执行DisposableBean和destroy-method

在所有的 bean 都初始化之后, Spring 会执行DisposableBean接口的destroy方法或者配置文件中指定的destroy-method方法。这些方法允许开发人员在 bean 销毁之前执行一些清理工作。

关闭BeanFactory

在销毁所有的 bean 之后,Spring 会关闭 BeanFactory。这个过程包括释放所有的资源,关闭所有的线程等。

扩展点

在初始化后阶段, Spring 提供了以下扩展点:

DisposableBean 和 destroy-method

DisposableBean 接口和 destroy-method 方法都允许开发人员在 bean 销毁之前执行一些清理工作。这些方法在所有的 bean 都销毁之前执行。

以下是一个示例:

public class MyBean implements DisposableBean {public void destroy() throws Exception {// 在这里执行清理工作}
}

可以在 Spring 的配置文件中使用destroy-method定义这个清理方法:


<bean id="myBean" class="com.example.MyBean" destroy-method="destroy"/>

结论

Spring 框架的生命周期包括初始化前、初始化、初始化后三个阶段。

在初始化前阶段, Spring 会加载配置文件、创建BeanFactory、预处理 BeanDefinition并执行 BeanFactoryPostProcessor。

在初始化阶段, Spring 会实例化 bean 、设置依赖关系并执行 BeanPostProcessor、InitializingBean 和 init-method。

在初始化后阶段, Spring 会执行 DisposableBean 和 destroy-method 并关闭 BeanFactory。通过这些扩展点,开发人员可以在 Spring 框架的生命周期的不同阶段执行一些定制化的操作,以满足不同的业务需求。

相关文章:

Spring 之初始化前中后详解

Spring 框架是一个非常流行的 Java 框架&#xff0c;它提供了一种轻量级的、可扩展的方式来构建企业级应用程序。在 Spring 的生命周期中&#xff0c;有三个重要的阶段&#xff0c;即初始化前、初始化、初始化后。这篇文章将详细介绍这些阶段&#xff0c;并提供相应的源代码示例…...

企业数字化转型路上的陷阱有哪些

近年来&#xff0c;随着科技的快速发展&#xff0c;越来越多的企业开始了数字化转型的征程&#xff0c;希望通过数字化技术来提高企业的效率、降低成本、提升竞争力。然而&#xff0c;数字化转型也存在许多陷阱&#xff0c;如果不注意&#xff0c;可能会导致企业陷入困境。下面…...

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强&#xff08;C&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调中引用…...

面试官:“你会组件化开发操作吗?它的优势在哪?”

随着 Android 版本的不断更新升级和用户对 APP 产品需求技术越来越高&#xff0c;相对的各大公司对 Android 开发者们设置的招聘门槛也越来越高。 至于如何去看一个开发者水平的高低&#xff0c;一般看面试官会怎么问&#xff0c;会问哪些部分的技术内容&#xff1f; 一般公司…...

腾讯新增长,AI扛大旗?

经历了疫情期间的低谷与波折&#xff0c;腾讯正在恢复它的活力。 3月22日&#xff0c;腾讯发布了2022年第四季度及全年财报。财报显示&#xff0c;2022全年营收为5546亿元人民币&#xff0c;归母净利润(Non-IFRS)为1156亿元人民币&#xff1b;2022年腾讯第四季度的营收为1450亿…...

项目6:实现数据字典的展示与缓存

项目6:实现数据字典的展示与缓存 1.数据字典如何展示? 2.前后端如何设计? 3.前端设计代码? 4.后端设计代码? 5.实现数据字典缓存到redis 项目6:实现数据字典的展示与缓存 1.数据字典如何展示? ①数据字典展示 树形结构②...

JsNode算法题acm模式输入

js分为jsNode和JsV8两种输入输出方式&#xff0c;一般的执行代码还是一样的 牛客是两种都支持 华为的题目大多只支持jsNode 本文主要介绍jsNode的输入 JsNode 首先他是逐行输入的&#xff0c;就和py差不多&#xff0c;一定是每行每行地输入&#xff0c;用字符串line&#x…...

Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加

Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加 目录 Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加 0.创建数据库 1. 在resources目录下创建db.properties文件 2. /** * 获取链接与释放资源的工具类--JdbcUtil类 */ 3…...

(十七)排序算法-基数排序

1 基本介绍 1.1 概述 &#xff08;1&#xff09;基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。 &#xff08;2&#x…...

JMM之先行发生原则(happens-before)详解

1、概述 在JMM规范下&#xff0c;如果一个操作执行的结果需要对另一个操作可见&#xff0c;那么这两个操作之间必须存在happers-before(先行发生)原则。 例如 int x 10 ; int y x; 这两行代码中第二个操作 yx &#xff0c;因为需要将x值赋值给y&#xff0c;所以第一行代码的…...

含分布式电源的配电网可靠性评估研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

安全加固服务是什么?哪些行业需要做?

安全加固服务是什么&#xff1f;安全加固服务是一种针对企业信息系统、网络设备、应用程序等进行安全加固和优化的服务。安全加固服务的主要目的是保障企业信息系统的安全性和稳定性&#xff0c;有效防范各类网络攻击和安全威胁。 安全加固服务是什么&#xff1f;通常包括以下…...

好程序员:Java书籍推荐,程序员必看的5本Java书籍,赶紧收藏!

今天好程序员给大家推荐5本Java书籍&#xff0c;各大高校都在使用&#xff08;具体名单如下&#xff09;&#xff0c;所有学习Java的程序员都不应该错过&#xff01; 第一本Java书籍《Java EE&#xff08;SSM框架&#xff09;企业应用实战》 本书全面介绍了JavaEE中MyBatis、Sp…...

maven将jar包添加到本地仓库

第一步&#xff1a;下载需要添加的jar包 可以在maven库中查找下载&#xff0c;也可以在对应官网下载 maven库网址&#xff1a;https://mvnrepository.com/ 找到对应版本的jar包下载 第二步&#xff1a;将下载的jar包放到指定位置&#xff08;位置自己指定&#xff09;&#xf…...

4.12--计算机网络之TCP篇之TCP 协议的缺陷+如何基于 UDP 协议实现可靠传输?--(复习+大总结)---沉下心来(加油呀)

TCP 协议四个方面的缺陷&#xff1a; 1.升级 TCP 的工作很困难&#xff1b; TCP 协议是在内核中实现的&#xff0c;应用程序只能使用不能修改&#xff0c;如果要想升级 TCP 协议&#xff0c;那么只能升级内核。 而升级内核这个工作是很麻烦的事情 2.TCP 建立连接的延迟&#x…...

数据库网络编程

数据库网络编程是一个重要的领域&#xff0c;它涉及到如何使用编程语言与数据库进行交互&#xff0c;以及如何设计和实现网络应用程序。在这篇文章中&#xff0c;我将探讨数据库网络编程的基础知识、常用技术和实践经验&#xff0c;以及一些应用案例和未来发展趋势。 一、基础…...

为什么现代企业都在使用ERP系统 它有哪些优势

随着科技的不断发展&#xff0c;企业管理方式也在不断地发生改变。在这个信息化的时代&#xff0c;企业要想取得成功&#xff0c;必须要善于利用先进的信息化技术工具。其中&#xff0c;ERP系统是企业管理中不可或缺的重要工具。本文将探讨现代企业为什么会使用ERP系统&#xf…...

别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?

老铁们是不是经常为写一些实体转换的原始代码感到头疼&#xff0c;尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct &#xff0c;可以轻松优雅的进行转换&#xff0c;简化你的代码。当然有的人喜欢写get set&#xff0c;或者用BeanUtils 进行复制&#xff0c;代码只是…...

LeetCode算法小抄-- 最近公共祖先 和 完全二叉树的节点个数

LeetCode算法小抄-- 最近公共祖先 和 完全二叉树的节点个数 最近公共祖先[236. 二叉树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/)[235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-b…...

php、redis实现分布式锁的正确写法(原子操作 通用类 加讲解)

最终代码(通用类) 1 面试中、实际工作中&#xff0c;经常涉及到 redis 分布式锁&#xff0c;正确写法如下。先奉上代码&#xff0c;再讲解。 <?php namespace app\common\library; /*** 通用分布式锁(原子操作)*/ class Lock {/*** 获取redis实例* return \Redis* throws…...

【Oracle APEX开发小技巧12】

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

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...