spring中ApplicationContext的用法和作用举例

server/2024/9/24 8:38:36/

在Spring框架中,ApplicationContext是Spring IoC(Inversion of Control,控制反转)容器的核心接口之一。它负责管理和配置应用程序中的Bean,并提供了丰富的功能,如依赖注入、事件发布、国际化等。下面将详细介绍ApplicationContext的用法和作用,并给出一些具体的例子。

1. 获取Bean
ApplicationContext最常用的功能之一是从容器中获取Bean。这可以通过getBean方法实现。

示例代码
java
深色版本
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 创建ApplicationContext对象,加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 从容器中获取Bean
        MyBean myBean = (MyBean) context.getBean("myBean");

        // 调用Bean的方法
        myBean.doSomething();
    }
}
解释
创建ApplicationContext对象:
java
深色版本
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ClassPathXmlApplicationContext是ApplicationContext的一个实现类,用于从类路径中加载XML配置文件。
"applicationContext.xml"是配置文件的路径。
从容器中获取Bean:
java
深色版本
MyBean myBean = (MyBean) context.getBean("myBean");
getBean方法用于从容器中获取指定名称的Bean。
"myBean"是Bean的ID或名称。
调用Bean的方法:
java
深色版本
myBean.doSomething();
调用获取到的Bean的方法。
2. 自动装配
ApplicationContext支持自动装配(Auto-Wiring),可以自动将依赖注入到Bean中。

示例代码
java
深色版本
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyService {
    private MyBean myBean;

    @Autowired
    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }

    public void doService() {
        myBean.doSomething();
    }
}
解释
定义MyService类:
java
深色版本
@Component
public class MyService {
    private MyBean myBean;

    @Autowired
    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }

    public void doService() {
        myBean.doSomething();
    }
}
@Component注解标记MyService类为Spring管理的组件。
@Autowired注解用于自动注入MyBean依赖。
从容器中获取MyService并调用其方法:
java
深色版本
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = (MyService) context.getBean("myService");
myService.doService();
3. 事件发布
ApplicationContext支持事件发布机制,可以发布和监听事件。

示例代码
java
深色版本
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

@Component
public class EventPublisher implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publishEvent() {
        CustomEvent event = new CustomEvent(this, "Hello, World!");
        publisher.publishEvent(event);
    }
}
解释
定义EventPublisher类:
java
深色版本
@Component
public class EventPublisher implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publishEvent() {
        CustomEvent event = new CustomEvent(this, "Hello, World!");
        publisher.publishEvent(event);
    }
}
@Component注解标记EventPublisher类为Spring管理的组件。
ApplicationEventPublisherAware接口用于获取ApplicationEventPublisher,从而可以发布事件。
publishEvent方法创建并发布一个自定义事件CustomEvent。
定义CustomEvent类:
java
深色版本
import org.springframework.context.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;
    }
}
定义EventListener类:
java
深色版本
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class EventListener {
    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        System.out.println("Received custom event: " + event.getMessage());
    }
}
从容器中获取EventPublisher并发布事件:
java
深色版本
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
EventPublisher eventPublisher = (EventPublisher) context.getBean("eventPublisher");
eventPublisher.publishEvent();
4. 国际化
ApplicationContext支持国际化(i18n),可以通过MessageSource接口获取不同语言的消息。

示例代码
java
深色版本
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

@Configuration
public class AppConfig {
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}
解释
定义AppConfig类:
java
深色版本
@Configuration
public class AppConfig {
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}
@Configuration注解标记AppConfig类为配置类。
messageSource方法定义了一个MessageSource Bean,用于加载国际化资源文件。
从容器中获取MessageSource并获取消息:
java
深色版本
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        MessageSource messageSource = (MessageSource) context.getBean("messageSource");
        String message = messageSource.getMessage("greeting", null, "Default Greeting", Locale.US);
        System.out.println(message);
    }
}
总结
ApplicationContext在Spring框架中扮演着核心角色,提供了丰富的功能,如Bean管理、自动装配、事件发布和国际化等。通过这些功能,可以更灵活地管理和配置应用程序中的组件,提高开发效率和代码的可维护性。


http://www.ppmy.cn/server/121260.html

相关文章

ubuntu22 解决docker无法下载镜像问题

参考在 Ubuntu 中安装 Docker_ubuntu安装docker-CSDN博客 安装docker完成后,运行如下命令验证 Docker 服务是否在运行: systemctl status docker 运行(sudo docker run hello-world)例子报错: 问题:Docker…

Sentinel-1 数据处理时如何手动下载高程数据

在Sentinel-1 数据数据预处理时,会使用高程数据进行地形校正。但选择自动下载高程时,由于网络原因经常会卡死,造成预处理过程不能正常进行! 这个问题经过我的反复实践,可以通过手动下载高程数据来解决。下面是具体方法…

使用IDA Pro动态调试Android APP

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server,IDA Pro …

C++(学习)2024.9.20

目录 C面向对象的基础知识 this指针 概念 功能 1.类内调用成员 2.区分重名的成员变量和局部变量 3. 链式调用 static关键字 1.静态局部变量 2.静态成员变量 3.静态成员函数 4.单例设计模式 const关键字 1.const修饰成员函数 2.const修饰对象 3.const修饰成员变量…

GNU链接器(LD):输入分区和输出分区介绍

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…

[vulnhub] Hackademic.RTB1

第一次打靶机,思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境:kali Linux - 192.168.75.131,靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线,不进行端口扫描 nmap -sP 192.16…

漏洞挖掘 | Selenium Grid 中的 SSRF

Selenium 网格框架上的基本服务器端请求伪造 最近,我正在阅读漏洞文章看到Peter Jaric写的一篇 Selenium Grid 文章;他解释了 Selenium Grid 框架上缺乏身份验证和安全措施强化的问题。 在网上进行了更多搜索,我发现 Selenium Grid 开箱即用…

Webpack 常见配置项

1. entry 指定一个或多个入口点,Webpack 从这里开始构建依赖图。 entry: {main: ./src/index.js,admin: ./src/admin.js }2. output 指定输出文件的路径和名称。 output: {filename: [name].bundle.js,path: path.resolve(__dirname, dist),publicPath: /assets…