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 配置:

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

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

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
4. 使用 ApplicationContext
java 复制代码
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();
    }
}

结果

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

java 复制代码
Hello, Spring!

事件传播

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

1. 创建事件类
java 复制代码
import org.springframework.context.ApplicationEvent;

public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}
2. 创建监听器
java 复制代码
import org.springframework.context.ApplicationListener;

public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("Received event: " + event.getSource());
    }
}
3. 修改配置类以注册监听器和发布事件
java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public MyEventListener myEventListener() {
        return new MyEventListener();
    }
}
4. 发布事件

在主方法中发布事件:

java 复制代码
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!"));
    }
}

事件输出

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

java 复制代码
Hello, Spring!
Received event: Hello, this is a custom event!

总结

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

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

相关推荐
微三云、小叶9 分钟前
排队免单系统底层设计:四种分配算法拆解,无预支资金的合规营销架构方案
java·前端·软件开发·商业模式·本地生活·商业思维
就叫_这个吧12 分钟前
Java+MySQL+Mybatis+Junit4实现学生信息管理系统
java·mysql·mybatis
乐之者v12 分钟前
xxl-job添加执行器
java
copyer_xyf15 分钟前
Python 内存分析:从栈和堆理解对象引用
前端·后端·python
可乐ea37 分钟前
【知识获取与分享社区项目 | 项目日记第 19 天】基于 Elasticsearch 实现关键词检索与业务权重排序
java·大数据·spring boot·mysql·elasticsearch·搜索引擎·全文检索
金銀銅鐵1 小时前
用 Tkinter 实现一个简单的罗马数字转化工具
后端·python
用户398346161201 小时前
Go-Spring 实战第 18 课 —— App 使用:启动、配置与运行期扩展
spring·go
zzz_23681 小时前
【Spring】面试突击系列(一):IoC 与 DI 深度解析
java·spring·面试
于先生吖1 小时前
前后端分离体育服务项目,场馆计费+线下赛事排行小程序部署开发教程
java·小程序·uni-app
RemainderTime1 小时前
Spring Boot脚手架集成 Spring Security实现生产级RBAC鉴权
spring boot·后端·spring