spring中ApplicationContext的用法和作用举例

在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.xdnf.cn/news/1543200.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

并发编程 - 锁(NSLock)

引言 在多线程编程中,数据一致性是一个必须解决的问题。多个线程同时访问同一片共享数据时,极易发生竞争条件(race conditions),导致数据的不一致性,甚至程序崩溃。为了解决这些问题,我们需要引…

大模型备案最难材料搞定——安全评估报告、安全评估测试题【评估测试题+备案源文件】

大模型备案,最难搞定的2个材料,安全评估报告,安全评估测试题、拦截词,这里都有了 文章目录 (一)适用主体 (二)语料安全 (三)模型安全 (四&…

Java_Se 数据变量与运算符

标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。这些是编程中的“砖块”,是编程的基础。要想开始正式编程,还需要再学“控制语句”,控制语句就像“水泥”,可以把“砖块”粘到一起,最终形成“一座大…

2024年图纸加密防泄密软件Top10榜单 | 防止CAD图纸泄密打造坚不可摧的图纸安全

在当今数字化高速发展的时代,图纸作为重要的知识产权和商业机密,其安全问题备受关注。 一旦图纸泄露,可能给企业和个人带来巨大的损失。 为了保护图纸的安全,各种加密防泄密软件应运而生。下面为大家揭晓2024 年图纸加密防泄密软…

修复 msvcr120.dll 丢失的方法,总结几个靠谱有效的方法

1. msvcr120.dll 定义 1.1 Microsoft Visual C Redistributable Package 的一部分 msvcr120.dll 是 Microsoft Visual C 2013 Redistributable Package 的核心组件,该包为运行时环境提供了必要的库文件。它确保了使用 Visual C 2013 编译的应用程序能够在没有开发…

想在产品上扩展大储存怎么做?开源啦!

相比伙伴们都遇到过,芯片内存不够的问题:经常会有大量的照片、音频、文档等需要存储,怎么办呢? 我们知道可以外扩,要编写各种驱动,还有Flash替换,这个工程不可谓不大啊! 但&#x…

Spring中的容器接口

容器接口 首先了解一下BeanFactory和ApplicationContext这两个接口的关系。 其实在一个 SpringBoot 项目中,这个 SpringBoot 项目的启动类的返回值就是一个 ApplicationContext 接口的实现类。 然后在 IDEA 中选中这个类,按住ctrlaltU可以查看类图&…

JavaScript 安装库npm报错

今天在编写JavaScript代码时,缺少了包express。 const express require(express); const app express();app.get(/, (req, res) > {res.send(Hello, world!); });app.listen(3000, () > {console.log(Server is running on port 3000); });npm install exp…

小程序开发设计-小程序的宿主环境:组件⑦

上一篇文章导航: 小程序开发设计-小程序的宿主环境:宿主环境简介⑥-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142425131?spm1001.2014.3001.5501 注:不同版本选项有所不同,并无大碍。 1.小程序中组件的分类…

深度学习(1):基础概念与创建项目

文章目录 基础概念创建项目1.在Anaconda上创建序虚拟环境2.创建PyProject3.创建完成 基础概念 CPU(中央处理器) CPU 是计算机的核心部件,负责执行计算和逻辑操作。它按照指令序列进行任务处理,擅长处理串行任务。CPU 的性能直接…

【MyBatis 源码拆解系列】MyBatis 运行原理 - 读取 xml 配置文件

欢迎关注公众号(通过文章导读关注:【11来了】),持续 分享大厂系统设计! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址:点击…

Nature:科研论文中正确使用ChatGPT的三个原则

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 美国科罗拉多大学安舒茨医学院的生物医学信息学研究员Milton Pividori,一直在探索如何将ChatGPT等AI工具该技术融入课题组日常科研任务,例如进行文献综…

远程升级不成功?背后“凶手”可能是模组差分包…

最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试,发现只有去年某批采购的那批模块在客户环境附近会出现掉线的情况,而今年采购的模块批次就不会掉线,很奇怪。 这个出问题的模块,就是合宙4G-Cat.1低功耗…

01.前端面试题之ts:说说如何在Vue项目中应用TypeScript?

文章目录 一、前言二、使用Componentcomputed、data、methodspropswatchemit 三 、总结 一、前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官方推出…

数据驱动农业——农业中的大数据革命

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

静态链接和动态链接的Golang二进制文件

关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认…

抖音截流神器发布:不限量评论采集,实时推送,提升运营效率

在短视频风靡的今天,抖音成为品牌营销的新战场。如何在海量内容中脱颖而出,提升运营效率成为关键。本文将揭秘一款革命性的抖音运营工具,它不仅支持不限量评论采集,还实现了实时推送功能,助力运营者精准把握用户反馈&a…

保姆级 Stable Diffusion 教程,看完这篇就够了!

在美国科罗拉多州举办了一场新兴数字艺术家竞赛,一幅名为《太空歌剧院》的作品获得“数字艺术/数字修饰照片”类别的一等奖,神奇的是,该作品的作者并没有绘画基础,这幅画是他用 AI 生成的。 这让人们充分见识到AI 在绘画领域惊人的…

Shell实战(一)

Shell实战(一) 导语程序实例解压缩交互功能描述代码和运行结果实现解析 监视CPU和内存功能描述代码和运行结果实现解析 用户管理功能描述代码和运行结果实现解析 总结 导语 本篇引入三个书上的shell程序设计项目,由于书上的版本较老&#xf…