高级Spring之ApplicationContext功能

news2024/12/25 2:21:10

  第一步,我们先来看这个接口的内部结构,了解别人的内部,知己知彼,百战不殆:

 这个接口的扩展功能主要体现在它继承的四个接口上:

  • MessageSource:国际化功能

  • ResourcePatternResolver: 资源访问功能

  • ApplicationEventPublisher: Spring事件发布者功能

  • EnvironmentCapable:提供当前系统环境 Environment 组件功能

  • 国际化功能演示 

查看对应的方法:

 准备翻译资源信息:

         -------- messages_en.properties

hi=Hello

       --------messages_ja.properties

hi=こんにちは

        ---------messages_zh.properties

hi=你好

    使用context容器对象,通过getMessage方法。根据key进行翻译:

   //处理国际化资源(国际化能力)
       //中文(参数:key,变化的信息,翻译的类型)
        //根据key找到不同语言的翻译结果
        System.out.println(context.getMessage("hi", null, Locale.CHINA));
      //英文
        System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
        //日文
        System.out.println(context.getMessage("hi", null, Locale.JAPANESE));

 

资源访问功能演示:

查看对应的方法:

  第一个是根据路径获取多个资源,第二个是根据路径获取单个资源

//根据磁盘的路径获取单个资源
context.getResources("classpath:spring.properties");

//获取多个资源
  Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
        for (Resource resource : resources) {
            System.out.println(resource);
        }

  • 提供当前系统环境 Environment 组件功能演示:
       System.out.println(context.getEnvironment().getProperty("java_home"));
        System.out.println(context.getEnvironment().getProperty("server.port"));

  作用:获取配置信息

  • Spring事件发布者功能演示:

   定义事件:

//用户已注册事件
public class UserRegisteredEvent extends ApplicationEvent {
   // source 事件的事件源  
  public UserRegisteredEvent(Object source) {
        super(source);
    }
}

  发布事件:

   context.publishEvent(new UserRegisteredEvent(context));

接收事件(监听器):

@Component
public class Component2 {

    private static final Logger log = LoggerFactory.getLogger(Component2.class);

    @EventListener
//发的是什么事件,就用什么事件来接收
    public void aaa(UserRegisteredEvent event) {
        log.debug("{}", event);
        log.debug("发送短信");
    }
}

实现用户注册与发送短信之间的解耦:

@Component
public class Component1 {

    private static final Logger log = LoggerFactory.getLogger(Component1.class);

    @Autowired
    private ApplicationEventPublisher context;

    public void register() {
        log.debug("用户注册");
        context.publishEvent(new UserRegisteredEvent(this));
    }

}

   测试:

 context.getBean(Component1.class).register();

    重点: 发布事件,使用监听器来获取事件,作用(实现组件之间的解耦)

总结:

  • BeanFactory 与 ApplicationContext 并不仅仅是简单接口继承的关系, ApplicationContext 组合并扩展了 BeanFactory 的功能
  • 又新学一种代码之间解耦途径(发布事件)

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

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

相关文章

第23章_Tomcat和JavaEE入门

一、JavaEE简介什么是JavaEEJavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发平台。最早由Sun公司定制并发布,后由Oracle负责维护。JavaEE平台规范了在开发企业级web应用中的技术标准.在JavaEE平台…

Acwing——第 87 场周赛

题目链接 4797. 移动棋子 4798. 打怪兽 4799. 最远距离 题目描述 4797. 移动棋子 给定一个 5 行 5 列的方格矩阵,其中一个方格中有一个棋子。 现在,我们希望将棋子移动至矩阵的最中心方格中,即将其移动至矩阵的第 3行第 3列方格中。 每次…

8种时间序列分类方法总结

对时间序列进行分类是应用机器和深度学习模型的常见任务之一。本篇文章将涵盖 8 种类型的时间序列分类方法。这包括从简单的基于距离或间隔的方法到使用深度神经网络的方法。这篇文章旨在作为所有时间序列分类算法的参考文章。 时间序列定义 在涵盖各种类型的时间序列 (TS) 分…

分布式锁与实现(一)-为什么需要分布式锁

1 在开发中的锁是什么 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。 在java中我们有两种资源控制方式Synchronized与AQS 1.2 基于Synchronized实现的锁控制 Synchronized是java提供的一…

JDK 8新特性之Lambda表达式

目录 一:使用匿名内部类存在的问题 Lambda表达式写法,代码如下: 二:Lambda的标准格式 三:Lambda的实现原理 四:Lambda省略格式 五:Lambda的前提条件 六:函数式接口 七:Lambd…

05回溯法

文章目录装载问题回溯算法优化算法构造最优解0-1背包问题批处理作业调度问题图的M着色问题N皇后问题最大团问题回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回&…

12. 字典dict类型详解

1. 基础知识 (1) 字典(dictionary)是Python中另一个非常有用的内置数据类型。 (2) 列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。 (3) 字典是一种映射类型&#xff…

Flowable进阶学习(三)流程、流程实例挂起与激活;启动、处理、结束流程的原理以及相关表结构与变动

文章目录流程挂起与激活流程实例挂起与激活启动、处理、结束流程的原理一、启动流程的原理启动一个流程实例时涉及到的表及表结构:ACT_RU_EXECUTION 运行时流程执行实例ACT_RU_IDENTITYLINK 运行时用户关系信息ACT_RU_TASK 运行时任务表ACT_RU_VARIABLE 运行时变量表二、处理流…

过滤器Filter总结

过滤器Filter1. 简介2. 快速入门3. 执行流程4. 使用细节4.1 拦截路径4.2 过滤器链5. 案例5.1 需求5.2 LoginFilter1. 简介 过滤器是JavaWeb三大组件之一(Servlet、Filter,Listner); 作用: 把对资源(servl…

Ubuntu22.04 安装 ssh

文章目录Ubuntu22.04 安装 ssh一、 环境配置二、 启动远程连接三、 开放端口四、 远程连接Ubuntu22.04 安装 ssh 一、 环境配置 安装 Ubuntu 系统后,我们首先需要配置管理员 root 用户: sudo passwd root然后,进行软件源的更换&#xff1a…

14 Java集合(Map集合+HashMap+泛型使用+集合面试题)

集合14.11 Map集合14.11.1 Map集合特点14.11.2 Map集合体系结构14.12 HashMap14.12.1 HashMap基本使用14.12.2 HashMap实际应用14.12.3 HashMap练习14.12.4 HashMap底层实现原理14.12.5 put的过程原码14.12.6 resize过程原码14.12.7 get的过程原码14.13 HashTable14.14 泛型高级…

5-1中央处理器-CPU的功能和基本结构

文章目录一.CPU的功能二.CPU的基本结构(一)运算器1.运算器的基本组成2.专用数据通路方式3.CPU内部单总线方式(二)控制器1.基本组成2.实现过程(三)寄存器一.CPU的功能 中央处理器(CPU&#xff0…

并查集的入门与应用

目录 一、前言 二、并查集概念 1、并查集的初始化 2、并查集的合并 3、并查集的查找 4、初始化、查找、合并代码 5、复杂度 二、路径压缩 三、例题 1、蓝桥幼儿园(lanqiaoOJ题号1135) 2、合根植物(2017年决赛,lanqiaoO…

SQL注入篇 - 布尔盲注及延时注入

数据来源 盲注 什么是盲注: 布尔盲注原理 布尔盲注流程 手工盲注思路(以下的文章参考:DVWA-sql注入(盲注) - N0r4h - 博客园) 手工盲注的过程,就像你与一个机器人聊天,这个机器人知…

DGSEA | GSEA做完了不要停,再继续比较一下有意义的通路吧!~

1写在前面 GSEA大家都会用了,但GSEA也有它自己的缺点,就是不能比较两个基因集或通路的富集情况。🤒 今天介绍一个Differential Gene Set Enrichment Analysis (DGSEA),可以量化两个基因集的相对富集程度。😉 2用到的包…

Java中的位运算及其常见的应用

文章目录1、位运算1.1 原码、反码、补码1.2 位运算符2、位运算的应用2.1 取模运算2.2 奇偶性判断2.3 交换变量的值2.4 加法运算1、位运算 1.1 原码、反码、补码 计算机中所有数据的存储和运算都是以二进制补码的形式进行的。a —> 97,A —> 65,‘…

深入学习Vue.js(十二)编译器

模板DSL的编译器 1.编译器概述 编译器实际上是一段程序,他用来将一种语言A翻译为另一种语言B。其中,A被称为源代码,B被称为目标代码。编译器将源代码翻译为目标代码的过程被称为编译。完整的编译过程通常包含词法分析、语法分析、语义分析、…

软件测试——测试用例

作者:~小明学编程 文章专栏:测试开发 格言:热爱编程的,终将被编程所厚爱。 目录 测试用例的设计方法 等价类 边界值 错误猜测法 判定表法(使用于关系组合) 设计步骤 具体例子 正交法 场景设计法…

Redis相关简介

1. Redis 简介 在这个部分,我们将学习以下3个部分的内容,分别是: ◆ Redis 简介(NoSQL概念、Redis概念) ◆ Redis 的下载与安装 ◆ Redis 的基本操作 1.1 NoSQL概念 1.1.1 问题现象 在讲解NoSQL的概念之前呢&am…

8. R语言画:散点图、直方图、条形图、箱线图、小提琴图、韦恩图

b站课程视频链接: https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新,但是要花钱,我花99😢😢元买了,感觉讲的没问题,就是知识点结构有点乱,有点废话)&…