Spring 核心技术解析【纯干货版】- V:Spring 基础模块 Spring-Context 模块精讲

Spring 框架作为 Java 开发领域最流行的框架之一,其核心模块承载了大量企业级应用开发的基础功能。在 Spring 的核心模块中,Spring-Context 模块尤为重要,它不仅提供了应用上下文的管理功能,还扩展了事件驱动、国际化支持、资源加载等功能,是构建现代化 Spring 应用程序的基石。

本篇文章将深入解析 Spring-Context 模块的核心技术,涵盖模块概述、依赖关系、主要功能、注解支持,以及事件驱动模型等方面。通过这篇文章,您可以全面掌握 Spring-Context 模块的核心知识,为开发高效、可扩展的 Spring 应用奠定坚实基础。


文章目录

      • 1、Spring-Context 模块介绍
        • 1.1、Spring-Context 模块概述
        • 1.2、Spring-Context 模块依赖
        • 1.3、Spring-Context 模块作用
      • 2、ApplicationContext 的介绍
        • 2.1、ApplicationContext 的功能与特性
        • 2.2、ApplicationContext 的实现
      • 3、核心注解:Bean、配置和自动扫描
        • 3.1、@Configuration
        • 3.2、@Bean
        • 3.3、@Component
        • 3.4、@ComponentScan
      • 4、事件驱动
        • 4.1、事件驱动核心概念及 Spring-Context 模块的实现
          • 4.1.1、事件
          • 4.1.2、事件发布器
          • 4.1.3、事件监听器
          • 4.1.4、上下文事件
        • 4.2、使用示例
      • X、后记


1、Spring-Context 模块介绍

1.1、Spring-Context 模块概述

Spring-Context 模块,是 Spring 核心容器模块之一,它为应用程序上下文的管理提供了支持,同时也是许多其他 Spring 模块的依赖基础。

应用程序上下文,也称为 Application Context,来源于设计模式中的一个术语。在许多设计模式中,上下文通常用于隐式表示执行某个行为时所需的环境或条件。在 Spring-Context 模块中,这一抽象概念被具体实现为各种 Context 对象。

Spring-Context 模块中的 Context 是一个集中化的管理器,除了负责 Bean 的生命周期管理(如创建、初始化、销毁等),还提供了运行应用程序所需的各种服务。

1.2、Spring-Context 模块依赖

Spring-Context 模块的依赖有四个,分别是同为基础模块的 Spring-Beans 模块、Spring-Core 模块、Spring-Expression 模块和 AOP 模块中的 Spring-AOP 模块。

其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。Spring-Expression 提供对 SpEL 的支持。而 Spring-AOP 提供对 AOP 的支持。

1.3、Spring-Context 模块作用

由于 Spring-Context 模块依赖了全部的 Spring 基本模块,并在他们的基础上进一步完善相关功能,包括但不限于:资源管理、环境与配置管理、生命周期管理、校验与格式化、AOP 与声明式事务支持等内容。

本篇仅简单介绍一部分核心功能例如:应用上下文(ApplicationContext)、注解支持、事件驱动的内容。


2、ApplicationContext 的介绍

在 Spring 框架中,ApplicationContext 是最核心的接口之一,主要用于容纳和管理 Spring 容器中的所有 Bean 实例。它不仅拓展了 BeanFactory 接口,更是提供了更加丰富和灵活的功能。包括国际化支持、事件传播、AOP 支持等。

2.1、ApplicationContext 的功能与特性

下面是 ApplicationContext 的源码:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {@NullableString getId();String getApplicationName();String getDisplayName();long getStartupDate();@NullableApplicationContext getParent();AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

它继承了 BeanFactoryMessageSourceApplicationEventPublisher 等 6 个接口。

image-20241227142317781

下面是 ApplicationContext 继承的 6 个父接口的说明:

  • MessageSource 接口:用于处理信息资源的国际化,能够支持多语言和地区化功能。
  • ApplicationEventPublisher 接口:是事件发布的接口,允许在 Spring 应用中发布事件。事件可以用于解耦应用的不同组件,让它们以松耦合的方式进行交互。
  • ResourcePatternResolver 接口:继承自 ResourceLoader,提供了扩展的功能来解析资源路径和资源模式。它支持通过模式(例如 classpath:)解析并加载资源,不仅能够加载文件,还可以加载类路径上的文件、网络资源等。
  • EnvironmentCapable 接口:提供对应用程序环境的访问。
  • ListableBeanFactory 接口:继承自 BeanFactory,增强了列举和查询 Bean 的能力。它允许你列出容器中所有 Bean 的名称、类型,甚至根据类型或名称进行过滤和查找。
  • HierarchicalBeanFactory 接口:继承自 BeanFactory,引入了 Bean 工厂的分层概念。它允许 Spring 容器支持层次化的 Bean 工厂结构,使得上下文可以有父容器和子容器。

ApplicationContext 的父接口,和下面的方法定义上,我们也可以大致总结出,ApplicationContext 有着:负责管理 Bean 的生命周期、提供事件发布、国际化支持、资源加载、环境配置及自动装配等功能。

2.2、ApplicationContext 的实现

上面我们介绍了 ApplicationContext 接口的功能,接着我们来看一下它的实现,Spring 提供了多个 ApplicationContext 实现类,每个实现类适用于不同的使用场景。

image-20241227144943593

以下是 ApplicationContext 的主要实现的介绍及特性:

  • ClassPathXmlApplicationContext:这是最常见的 ApplicationContext 实现之一,主要通过 XML 配置文件来加载和配置 Bean。它的实现基于 AbstractXmlApplicationContext 类,专门用于解析类路径下的 XML 配置文件,来初始化 Spring 容器。这种实现类适用于小型到中型项目,特别是在需要从类路径中加载配置文件的场景中。

    例如,假设我们有一个简单的 Spring 应用,配置文件位于 src/main/resources 目录下,可以使用 ClassPathXmlApplicationContext 来加载配置文件:

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
  • FileSystemXmlApplicationContext:这个实现类可以从文件系统中加载 XML 配置文件。它适用于需要从文件系统中加载配置文件的场景,例如在开发环境中,配置文件可能位于项目的根目录或某个特定的文件夹中。使用 FileSystemXmlApplicationContext 可以方便地加载这些配置文件:

    ApplicationContext context = new FileSystemXmlApplicationContext("file:/path/to/applicationContext.xml");
    
  • AnnotationConfigApplicationContext:基于注解的配置而设计的实现类。它支持 Java 配置类的方式,允许通过注解(如 @Configuration, @ComponentScan, @Bean 等)来配置 Spring 容器中的 Bean。它是 Spring 4 引入的,以支持纯 Java 配置,特别适用于 Spring Boot 等需要更灵活和简洁配置的现代 Spring 应用。

    例如,假设我们有一个配置类 AppConfig,可以使用 AnnotationConfigApplicationContext 来加载配置类:

    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    
  • GenericWebApplicationContext:Spring-Web 模块中提供的,是为 Web 应用设计的 ApplicationContext 实现类,继承自 GenericApplicationContext,专门用于 Spring Web 应用(例如 Spring MVC)。它结合了 Web 环境的特殊需求,提供了对 Web 组件的支持。

    GenericWebApplicationContext 通常通过 ContextLoaderListener 在应用启动时初始化:

    // web.xml 配置
    <context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </context-param>
    <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    

选择合适的 ApplicationContext 实现类需要综合考虑项目规模、配置方式、应用类型和性能需求。对于小型到中型项目,ClassPathXmlApplicationContextAnnotationConfigApplicationContext 是不错的选择,前者适合 XML 配置,后者更适合注解和 Java 配置。而在大型或复杂项目中,AnnotationConfigApplicationContext 提供了更高的灵活性和扩展性,而 Web 应用推荐使用支持 Servlet 和 JSP 配置的 GenericWebApplicationContext。如果性能是关键考虑因素,注解驱动的 AnnotationConfigApplicationContext 通常比 XML 配置的实现类更高效。总之,根据具体需求选择最合适的实现类,能更好地平衡项目的开发效率与运行性能。


3、核心注解:Bean、配置和自动扫描

3.1、@Configuration

模块:spring-context 模块。

作用:标记一个类为配置类,类似于传统 XML 配置中的 <beans> 标签,表示该类中定义的 Bean 都会被 Spring 容器管理。

使用方式:通常与 @Bean 注解一起使用,在配置类中定义 Bean。

使用示例:

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}
3.2、@Bean

模块:spring-context 模块。

作用:标记方法为 Bean 定义,用于将方法返回的对象注册到 Spring 容器中,通常配合 @Configuration 使用。

使用方式:在 @Configuration 注解标注的类中,使用 @Bean 注解将方法返回值作为 Bean 注册到容器。

3.3、@Component

模块:spring-context 模块。

作用:标记类为 Spring 的组件(Bean),Spring 会自动扫描并将其注册到容器中。@Component 是一个通用的注解,可以通过 @ComponentScan 来扫描指定包中的类。

使用示例:

package com.lizhengi.service@Component
public class MyService {// Service logic
}

常见衍生注解:

  • @Service:通常用于服务层的 Bean。
  • @Repository:通常用于数据访问层的 Bean,包含数据访问相关的异常转换功能。
  • @Controller:通常用于标注 Spring MVC 中的控制器。
3.4、@ComponentScan

模块:spring-context 模块。

作用:用于自动扫描指定包中的 @Component 注解类,自动将它们注册到 Spring 容器中。通常配合 @Configuration 使用。

使用方式:指定要扫描的包或包的路径,自动注册标记为 @Component@Service@Repository@Controller 等注解的类。

使用示例:

@Configuration
@ComponentScan(basePackages = "com.lizhengi")
public class AppConfig {// 自动扫描指定包中的 Bean
}

4、事件驱动

Spring 的事件驱动模型,其实就是在 ApplicationContext 基础上加了个观察者模式。发布者负责发消息,监听者负责接收,Spring 负责中间传话。看似复杂,其实是个精简版的观察者模式,简单又高效。

观察者模式 的核心是 发布者 和 订阅者 的解耦,通过一个中间层(如事件管理器)让二者不直接依赖。Spring 的事件驱动模型 则完全复用了这一思想,ApplicationContext 扮演了 “事件管理器” 的角色,负责维护发布者和监听者之间的关系。

4.1、事件驱动核心概念及 Spring-Context 模块的实现
4.1.1、事件

事件(Event):事件是发生了某种操作或状态改变的信号。在 Spring 中,事件是 ApplicationEvent 的子类,也可以是任何自定义类。

public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}
4.1.2、事件发布器

事件发布器(Event Publisher):Spring 提供了 ApplicationEventPublisher 接口,用于发布事件。通常,通过注入 ApplicationEventPublisher 来发布事件:

@Component
public class EventPublisher {private final ApplicationEventPublisher publisher;public EventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;}public void publishCustomEvent(String message) {CustomEvent event = new CustomEvent(this, message);publisher.publishEvent(event);}
}
4.1.3、事件监听器

事件监听器(Event Listener):事件监听器用于处理特定类型的事件。可以通过 @EventListener 注解或者实现 ApplicationListener 接口来定义监听器:

使用 @EventListener

@Component
public class EventListenerExample {@EventListenerpublic void handleCustomEvent(CustomEvent event) {System.out.println("Received event - " + event.getMessage());}
}

实现 ApplicationListener 接口:

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println("Handled event - " + event.getMessage());}
}
4.1.4、上下文事件

Spring 自带了一些标准事件,例如:

  • ContextRefreshedEvent:容器初始化或刷新时发布。
  • ContextStartedEvent:容器调用 start() 方法时发布。
  • ContextStoppedEvent:容器调用 stop() 方法时发布。
  • ContextClosedEvent:容器关闭时发布。
4.2、使用示例

发布事件:

@SpringBootApplication
public class EventDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(EventDemoApplication.class, args);EventPublisher publisher = context.getBean(EventPublisher.class);publisher.publishCustomEvent("Hello, Spring Event!");}
}

异步监听:通过 @Async 注解,可以让事件处理在单独的线程中执行:

@Component
public class AsyncEventListener {@Async@EventListenerpublic void handleAsyncEvent(CustomEvent event) {System.out.println("Processing event asynchronously - " + event.getMessage());}
}

同时需要启用异步功能:

@EnableAsync
@SpringBootApplication
public class EventDemoApplication { }

X、后记

在快速发展的软件开发领域,Spring 框架凭借其灵活性和强大的功能始终处于领先地位,而 Spring-Context 模块作为其核心之一,为开发者提供了丰富的功能支持。掌握 Spring-Context 的使用,不仅可以帮助我们更高效地管理 Bean 生命周期和上下文环境,还能通过事件驱动、注解配置等特性构建出更加优雅和高效的应用架构。

希望本文能够帮助您深入理解 Spring-Context 模块,并在实际开发中灵活运用。如果您对文中内容有疑问或建议,欢迎留言讨论。让我们携手前行,在技术的道路上不断探索,共同进步!

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

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

相关文章

2025年国产化推进.NET跨平台应用框架推荐

2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费&#xff08;MIT License&#xff09;的跨平台框架&#xff08;支持Android、iOS、macOS 和 Windows多平台运行&#xff09;&#xff0c;是 Xamarin.Forms 的进化版&#xff0c;从移动场景扩展到…

SQL注入漏洞之基础数据类型注入 字符 数字 搜索 XX 以及靶场实例哟

目录 基础数据类型SQL注入 字符类型注入 单引号双引号解释 案例练习: 数字类型注入 案例 搜索性注入: 案例 XX性注入: 语句 案例 基础SQL注入类型分类 基础数据类型SQL注入 字符类型注入 xxx or 11 # select id,email from member where usernamexx or 11 # --…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

如何在data.table中处理缺失值

&#x1f4ca;&#x1f4bb;【R语言进阶】轻松搞定缺失值&#xff0c;让数据清洗更高效&#xff01; &#x1f44b; 大家好呀&#xff01;今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值&#xff0c;并且提供了一个自定义函数calculate_missing_va…

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…

华为支付接入规范

为了确保用户获得良好的支付体验&#xff0c;Payment Kit制定了相关接入设计规范&#xff0c;请开发者遵照执行&#xff0c;具体要求&#xff08;非强制性&#xff09;如下&#xff1a; 一、支付方式呈现 涉及支付公司名称&#xff0c;请统一使用&#xff1a;花瓣支付&#xff…

Python人脸识别库DeepFace使用教程及源码解析

目录 一、DeepFace介绍 1、人脸库设计 2、DeepFace.find 3、DeepFace.verify 4、DeepFace.analyze 5、DeepFace.extract_faces 6、DeepFace.represent 7、DeepFace.stream 二、DeepFace二次开发 1、开发活体检测API 2、模型权重持久化 三、总结 一、DeepFace介绍 …

三分钟简单了解一些HTML的标签和语法_02

1.a标签演示 点击然后跳转 代码加入title 2.图片链接 3.锚点链接 点击就会跳转的当前位置 4.a标签小知识补充 该实例会跳转到顶,锚点链接则会跳转到相应的锚点 5. 结果:直接跳转到该页面的锚点处 6. 在 HTML 中&#xff0c;<tr>标签表示表格中的行&#xff08;TableRow&…

多选multiple下拉框el-select回显问题(只显示后端返回id)

首先保证v-model的值对应options数据源里面的id <el-form-item prop"subclass" label"分类" ><el-select v-model"formData.subclass" multiple placeholder"请选择" clearable :disabled"!!formData.id"><e…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)

尚硅谷大数据数仓项目superset db upgrade报错解决&#xff08;2025.1.23解决&#xff09;和 superset安装MySQL报错解决 解决方法&#xff08;2025.1.23解决&#xff09; 0.卸载之前安装好的Superset -- 退出当前环境 conda deactivate-- 卸载Superset conda remove -n sup…

linux-mysql在centos7安装和基础配置

1.安装mysql数据库 1.使用官网安装 1.检查是否存在mysql的分支mariadb [rootlocalhost ~]# rpm -qa |grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [rootlocalhost ~]# 2.卸载这个分支包 [rootlocalhost ~]# rpm -qa | grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 …

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

移动端VR处理器和传统显卡的不同

骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程&#xff0c;而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下&#xff08;如移动端 XR 设备&#xff09;实现高性能和低功耗的平衡。以下是具体的分析&#xff1a; 1. AI 驱动的渲染…

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…

Git 小白入门教程

&#x1f3af; 这篇文章详细介绍了版本控制的重要性&#xff0c;特别是通过Git实现的分布式版本控制相对于SVN集中式控制的优势。文章首先解释了版本控制的基本概念&#xff0c;强调了在文档或项目多版本迭代中备份与恢复任意版本的能力。接着&#xff0c;重点阐述了Git的历史背…

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

【二叉树的深搜】二叉树剪枝

文章目录 814. 二叉树剪枝解题思路&#xff1a;深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 ​ 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 ​ 返回移除了所有不包含 1 的子树的原二叉树。 ​ 节点…