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

Spring 中ApplicationContext

   ApplicationContext 是 Spring 框架中最重要的接口之一,用于提供 Spring IoC 容器的功能。它是一个比 BeanFactory 更高级的容器,负责管理 Spring bean 的生命周期,同时提供对各种企业服务的集成,例如事件传播、国际化、弱引用等。ApplicationContext 充当了 Spring 应用程序的核心,它不仅可以创建和管理 bean,还负责支持更加复杂的功能。

ApplicationContext 的主要功能

  1. Bean 的创建和管理:负责实例化和管理应用中的所有 bean。
  2. 依赖注入:支持依赖注入,使得 bean 可以轻松地获取其依赖。
  3. 国际化支持:提供消息源以支持国际化功能,允许通过 MessageSource 对象进行文本信息的本地化。
  4. 事件传播:允许监听和发布事件,支持应用中的发布/订阅模式。
  5. Bean 的生命周期管理:支持初始化和销毁方法的配置。
  6. 资源加载:提供对资源(如文件和类路径资源)的访问功能。

常见的 ApplicationContext 实现

  • ClassPathXmlApplicationContext:从类路径中的 XML 文件加载应用上下文。
  • FileSystemXmlApplicationContext:从文件系统中的 XML 文件加载应用上下文。
  • AnnotationConfigApplicationContext:从 Java 配置类加载应用上下文,通常用于基于注解的配置。

使用示例

   以下是一个简单的示例,展示了如何使用 ApplicationContext 加载 bean 并进行依赖注入。

1. 引入 Spring 依赖

   在你的项目中引入 Spring 框架的依赖。以下是 Maven 项目的示例 pom.xml 配置:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version>
</dependency>
2. 创建 Bean 类
public class MyBean {public void sayHello() {System.out.println("Hello, Spring!");}
}
3. 创建配置类

   使用注解配置的方式定义 Spring 上下文。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}
4. 使用 ApplicationContext
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {// 创建应用上下文ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 bean 并调用方法MyBean myBean = context.getBean(MyBean.class);myBean.sayHello();}
}

结果

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

Hello, Spring!

事件传播

   ApplicationContext 支持应用事件,你可以使用 ApplicationEventPublisher 来发布事件,并使用 ApplicationListener 来监听这些事件。

1. 创建事件类
import org.springframework.context.ApplicationEvent;public class MyEvent extends ApplicationEvent {public MyEvent(Object source) {super(source);}
}
2. 创建监听器
import org.springframework.context.ApplicationListener;public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("Received event: " + event.getSource());}
}
3. 修改配置类以注册监听器和发布事件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}@Beanpublic MyEventListener myEventListener() {return new MyEventListener();}
}
4. 发布事件

在主方法中发布事件:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean myBean = context.getBean(MyBean.class);myBean.sayHello();// 发布事件context.publishEvent(new MyEvent("Hello, this is a custom event!"));}
}

事件输出

当运行代码时,您将看到输出:

Hello, Spring!
Received event: Hello, this is a custom event!

总结

  • ApplicationContext:是 Spring 的核心接口,提供了对 bean 管理、依赖注入、事件传播、国际化等功能的支持。
  • 实现类:最常用的实现类包括 ClassPathXmlApplicationContextFileSystemXmlApplicationContext 和 AnnotationConfigApplicationContext
  • 使用示例:通过注解方式创建 bean 和配置类,展示了如何使用 ApplicationContext 加载和使用 bean。
  • 事件传播:支持自定义事件发布和监听功能,扩展了应用的功能。

   通过 ApplicationContext,开发者可以构建灵活和可扩展的应用程序,充分利用 Spring 框架的强大功能。

http://www.lryc.cn/news/427021.html

相关文章:

  • python之时间 datetime、date、time、timedelta、dateutil
  • 【机器学习第11章——特征选择与稀疏学习】
  • LeetCode-day43-3137. K 周期字符串需要的最少操作次数
  • 基于springboot的智能家居系统
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(七)
  • C:每日一练:单身狗(2.0版本)
  • 打破接口壁垒:适配器模式让系统无缝对接
  • U-Boot 命令使用
  • 谷歌的高级指令有哪些
  • Redis操作--RedisTemplate(一)介绍
  • GitLab环境搭建
  • Socket编程TCP 基础
  • JAVA中的Iterator与ListIterator
  • 高校疫情防控web系统pf
  • 复现nnUNet2并跑通自定义数据
  • Educational Codeforces Round 169 (Rated for Div. 2)(ABCDE)
  • 成为Python砖家(2): str 最常用的8大方法
  • 深入理解JVM运行时数据区(内存布局 )5大部分 | 异常讨论
  • JAVA根据表名获取Oracle表结构信息
  • 网络性能优化
  • [C++String]接口解读,深拷贝和浅拷贝,string的模拟实现
  • 理性看待、正确理解 AI 中的 Scaling “laws”
  • 【OCR 学习笔记】二值化——全局阈值方法
  • Java - IDEA开发
  • Oracle(62)什么是内存优化表(In-Memory Table)?
  • #window家庭版安装hyper-v#
  • 【云原生】Pass容器研发基础——汇总篇
  • 【Py/Java/C++三种语言详解】LeetCode743、网络延迟时间【单源最短路问题Djikstra算法】
  • 交替输出
  • JS(三)——更改html内数据