Spring 中AbstractApplicationContext

  AbstractApplicationContext 是 Spring Framework 中的一个抽象类,位于 org.springframework.context 包中。它带有一系列的实现,主要用于为 Spring 的应用上下文提供基本的功能。所有的 Spring 应用上下文实现(如 ClassPathXmlApplicationContextFileSystemXmlApplicationContextAnnotationConfigApplicationContext 等)通常都直接或间接地扩展该类。

主要功能

AbstractApplicationContext 提供了一些核心功能,包括:

  1. 生命周期管理: 提供对应用上下文的初始化与关闭的生命周期管理。这包括在上下文启动时注册和初始化所有 singleton beans,以及在上下文关闭时执行清理和销毁方法。

  2. Bean 后处理器: 支持注册 BeanPostProcessors,以允许在 bean 初始化之前或之后进行操作。通过这些后处理器,开发者可以实现在 bean 的创建和使用过程中插入自定义逻辑。

  3. 事件发布: 提供对事件的发布和监听的支持,允许在应用程序中以发布/订阅的方式进行事件驱动编程。

  4. 消息源: 实现了 MessageSource 接口,支持国际化和本地化文本的访问。

  5. 资源加载: 提供了对应用程序资源的访问,支持 URL、文件系统路径等多种资源位置的解析。

关键方法

   以下是 AbstractApplicationContext 中的一些重要方法:

  • refresh(): 刷新应用上下文,重新加载 bean 定义,创建 bean 实例,初始化 beans。

  • registerShutdownHook(): 注册 JVM 钩子,以便在 JVM 关闭时调用 close() 方法,确保容器的正确关闭。

  • close(): 关闭应用上下文,释放资源,销毁 beans。

  • publishEvent(ApplicationEvent event): 发布应用事件,通知所有监听器。

  • addApplicationListener(ApplicationListener<?> listener): 添加事件监听器。

使用示例

   下面是一个简单的示例,展示如何使用 AbstractApplicationContext 的子类。

1. 引入 Spring 依赖

 在 Maven 项目的 pom.xml 中添加 Spring 依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version>
</dependency>
2. 创建 Bean 类
public class MyService {public void serve() {System.out.println("Service is running...");}
}
3. 创建配置 XML 文件

在 src/main/resources 中创建一个 beans.xml 文件,内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="myService" class="MyService" />
</beans>
4. 使用 Concrete Application Context(如 ClassPathXmlApplicationContext
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {// 创建应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 获取 bean 实例MyService myService = (MyService) context.getBean("myService");myService.serve(); // 输出 "Service is running..."// 关闭上下文((ClassPathXmlApplicationContext) context).close(); // 这是示例中的关闭,具体实现会不同}
}

结果

 运行上述代码时,你将看到输出:

Service is running...

注意事项

  • 扩展性AbstractApplicationContext 是一个设计良好的抽象类,通过它,Spring 能够实现各种具体的应用上下文,如 XML、Java、注解等配置方式。

  • 性能优化: 在使用 Spring 的应用上下文时,确保正确关闭上下文,以释放资源并执行销毁方法。

  • 事件驱动: 利用 publishEvent 方法和事件监听器,可以在应用程序中实现强大的事件驱动架构。

结论

  • AbstractApplicationContext: 是 Spring 应用上下文的核心抽象类,提供了多种功能以管理 bean、发布事件、处理国际化等任务。

  • 功能全面: 包含 bean 生命周期、后处理器、事件管理等关键功能,适用于各种 Spring 应用程序。

  • 学习与实践: 理解 AbstractApplicationContext 是掌握 Spring 应用上下文及其功能的重要一步,帮助开发者灵活构建和管理复杂的应用。

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

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

相关文章

vue3列表页搜索条件封装

搜索框组件 封装常用搜索框组件&#xff0c;类型有&#xff1a; input&#xff08;默认值)selectselectV2 (value/label键值对数组)datePickeryear 集成新增、修改、删除、导入、导出按钮&#xff0c;支持slot自定义其他按钮封装搜索、重置按钮封装按钮权限封装导入弹框 本例仅…

找到你的任务管理伙伴:待办事项软件终极指南

国内外主流的10款待办事项管理软件对比&#xff1a;PingCode、WorktileTodoist、TickTick、Teambition、 Microsoft To Do、. Asana、Tower、番茄ToDo、飞书。 在面对日益复杂的工作和个人任务时&#xff0c;找到一款能够有效帮助你管理日常待办事项的软件&#xff0c;变得越来…

Baumer工业相机堡盟工业相机如何通过BGAPISDK初始化时过滤其它非Baumer相机(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK初始化时过滤其它非Baumer相机&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机通过SDK初始化时过滤其它非Baumer相机的技术背景通过SDK过滤其它非Baumer相机的代码分析1、引用合适的类文件2、初始化时过滤其它非Baumer相机…

[RCTF2015]EasySQL1

打开题目 点进去看看 注册个admin账户&#xff0c;登陆进去 一个个点开看&#xff0c;没发现flag 我们也可以由此得出结论&#xff0c;页面存在二次注入的漏洞&#xff0c;并可以大胆猜测修改密码的源代码 resoponse为invalid string的关键字是被过滤的关键字&#xff0c;Le…

blender内置树木的UV

之前听说用这个内置插件可以创建树木 我这边的默认配置出来的树木长这样&#xff0c;不得不想一下&#xff0c;他的uv怎么展&#xff0c;看起来好多树 我尝试看了一眼默认的UV 结果如下 好像每个树枝都已经是平铺的样子了&#xff0c;那么如果需要改的话&#xff0c;就根据…

大模型预训练与微调之间的关系

1. 引言 大语言模型的兴起与训练范式 在过去的十年中&#xff0c;随着计算能力和数据规模的显著提升&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;领域掀起了一场革命…

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

算法【Java】—— 双指针算法

双指针算法 常见的双指针有对撞指针&#xff0c;快慢指针以及前后指针&#xff08;这个前后指针是指两个指针都是从从一个方向出发&#xff0c;去往另一个方法&#xff0c;也可以认为是小学学习过的两车并行&#xff0c;我也会叫做同向指针&#xff09;&#xff0c;在前后指针…

【CMake】学习笔记2

文章目录 06.指定头文件路径07.通过CMake制作库文件制作动态库或静态库制作静态库制作动态库指定动态库/静态库输出的路径 08.在程序中链接静态库09.在程序中链接动态库11. 在cmake中打印日志信息12.字符串操作使用set拼接使用list拼接list字符串移除list其他命令 06.指定头文件…

vscode中使用官方推荐的编程字体Cascadia Code字体

字体样式 > 和 有特殊效果 很多字体都支持使用连字&#xff0c;Cascadia Code 、Jetbrains Mono 、Fira Code 等 安装Cascadia Code 下载完成后解压安装 选中右键安装&#xff0c;static文件里也一样安装 VS Code 中配置设置字体和连字设置 Cascadia Code, Consolas, Couri…

使用Java连接redis的方式

除了使用 Spring Data Redis&#xff0c;Java 连接 Redis 还可以通过以下几种方式&#xff1a; 1. Jedis Jedis 是一个流行的 Java Redis 客户端库&#xff0c;提供了简单的 API 来访问 Redis。 依赖&#xff1a; <dependency><groupId>redis.clients</grou…

Spring Boot集成Jythonb并且支持三方的python依赖包

上篇文章讲了 如何在java中执行python代码&#xff0c;这篇文章讲一下如何让jython支持三方依赖包 1.什么是Jython&#xff1f; Jython是Python编程语言的JVM实现。 它旨在在Java平台上运行。 Jython程序可以导入和使用任何Java类。 就像Java一样&#xff0c;Jython程序编译为…

SX_UNIX套接字通信_15

UNIX套接字通信的优势&#xff1a; UNIX套接字通信常用于一个项目中的进程之间通信&#xff0c;UNIX提供了与网络套接字相似的特性&#xff0c;但是避免了网络延迟&#xff0c;提高了性能&#xff0c;但是它只能在同一台机器上使用&#xff0c;无法跨越网络的进程间通信 实例&…

计算机的错误计算(六十七)

摘要 计算机的错误计算&#xff08;五十六&#xff09;与&#xff08;六十六&#xff09;分别探讨了大数与 附近数的正切函数值的错误计算。本节讨论第三种类型数值&#xff1a; 附近数 的正切函数的计算精度问题。 例1. 已知 计算 先用 Go语言计算&#xff1a; packag…

STL介绍以及string类

什么是STL 是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么要学习string类 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&am…

模具监视器的技术参数有哪些

模具监视器的技术参数涵盖了多个方面&#xff0c;这些参数对于确保模具监视器的性能、稳定性和检测精度至关重要。以下是一些主要的技术参数&#xff1a; 一、显示器参数 屏幕尺寸&#xff1a;常见的模具监视器显示器尺寸为12.5英寸至13.5英寸&#xff0c;具体尺寸可能因不同…

基于RabbitMQ的消息监听器

1. 背景 机构的新增、更新、删除在微服务A中已经完成了&#xff08;微服务A已经部署&#xff0c;不能修改代码&#xff09;&#xff0c;如果在微服务A中对机构进行新增、更新、删除操作后&#xff0c;需要同步到自己的微服务B中&#xff0c;这里采用MQ消息通知的方式实现。 微…

如何建立一个既能快速记录又易于回顾的笔记系统?

在快节奏的学习和工作中&#xff0c;能够快速记录和回顾信息变得尤为重要。尤其对于编程学习者来说&#xff0c;构建一个高效、有序的笔记系统不仅可以提高学习效率&#xff0c;还能帮助我们在未来轻松回溯知识要点。本文将详细探讨如何打造一个既快速记录又易于回顾的笔记系统…

打卡第48天------单调栈

今天正式开始单调栈&#xff0c;开启新的篇章了&#xff0c;那个动态规划真的太难了。不过卡尔总结的很全面&#xff0c;真的是收获不少呀。小坚持带来大改变。加油✊ 1. 每日温度 leetcode题目链接&#xff1a;739. 每日温度 题目描述&#xff1a; 给定一个整数数组 temperat…