Spring-ApplictionContext

Spring

Spring是整个Java体系最核心的框架,没有之一。

核心类图结构

在这里插入图片描述

ApplicationContext

  • ApplicationEventPublisher:提供了一种机制,用于通知应用程序中感兴趣的部分有关其执行过程中发生的特定事件。
  • ListableBeanFactory:是Spring框架中的一个接口,它继承了BeanFactory接口,是一个具有列表查询能力的Bean工厂。
  • HierarchicalBeanFactory:是Spring框架中的另一个接口,它扩展了BeanFactory接口。
  • ResourcePatternResolver:是 Spring Framework 中的一个接口,用于以资源位置模式的格式解析资源。
  • MessageSource:处理国际化资源的组件,用于支持国际化(i18n)和本地胡(l1On)。
  • EnvironmentCapable:是 Spring Framework 中的一个接口,用于表示一个对象是否具备获取环境(Environment)的能力。
  • FunctionalInterface:是 Java 8 引入的一个新的接口类型,它是一个特殊的接口,只能有一个抽象方法(可以有默认方法和静态方法),用于支持函数式编程。
  • BeanFactory:是 Spring 框架的核心接口之一,主要负责对Bean的配置和管理功能,具体的创建功能是由子类来实现注入的。
  • ResourceLoader:Spring Framework 中的一个接口,用于加载资源(Resource)的抽象。

BeanFactory

它是 Spring IoC(Inversion of Control,控制反转)容器的基础。IoC 容器负责管理和组装应用程序中的对象(也称为 Bean)。
在 Spring 中,BeanFactory 提供了以下主要功能:

  • 实例化对象:BeanFactory 负责根据配置元数据(通常是 XML 或注解)来实例化 Java 对象,这些对象被称为 Beans。它将对象的创建和初始化过程与应用程序代码解耦,使得对象的创建更加灵活和可配置。

  • Bean 的配置管理:BeanFactory 负责管理 Bean 的配置元数据。这些元数据定义了 Bean 的类型、依赖关系和其他属性。配置元数据可以通过 XML 配置文件、Java 注解或 Java 代码进行指定。

  • 依赖注入(Dependency Injection):BeanFactory 通过依赖注入的方式自动解析和设置 Bean 之间的依赖关系。依赖注入消除了硬编码的依赖关系,使得组件之间的协作更加灵活和可维护。

  • 单例和原型模式管理:BeanFactory 可以管理单例(Singleton)和原型(Prototype)两种类型的 Bean。单例 Bean 在容器中只有一个实例,而原型 Bean 每次被请求时都会创建一个新的实例。

  • 生命周期管理:BeanFactory 负责管理 Bean 的生命周期,它在需要的时候创建 Bean、初始化 Bean、调用 Bean 的初始化回调方法,并在容器关闭时销毁 Bean。

BeanFactory 接口定义了一些常用的方法,允许应用程序通过 Bean 名称或类型来访问和管理这些 Bean。常见的实现类包括 DefaultListableBeanFactory 和 XmlBeanFactory。

  • DefaultListableBeanFactory 是 Spring 框架默认的 BeanFactory 实现,支持基于 XML 配置和注解的 Bean 定义( class,scope, 初始化、销毁等信息)。

  • XmlBeanFactory 是较早的实现,它从 XML 配置文件中读取 Bean 定义并实例化相应的 Bean。不过在较新版本的 Spring 中,推荐使用DefaultListableBeanFactory 或者更高级的容器,如 ApplicationContext。

MessageSource

它提供了一种机制,允许应用程序通过统一的接口访问不同语言环境下的文本消息,从而使应用程序可以根据用户的语言偏好显示相应的文本信息。

在国际化和本地化的场景中,不同地区和语言可能有不同的语言、日期格式、货币符号等。通过使用 MessageSource,开发者可以将这些本地化的文本消息抽象出来,而不必硬编码到应用程序代码中,从而方便地实现多语言支持。
主要定义下面方法:

String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

其中,code 是消息的唯一标识符,args 是替换消息中占位符的参数数组,defaultMessage 是在找不到指定消息时的默认文本。locale 参数用于指定所需的语言环境。

Spring 中的 MessageSource 通常由 ResourceBundleMessageSourceReloadableResourceBundleMessageSource 等实现类来支持,这些实现类可以从属性文件(通常是 .properties 文件)或者其他资源中加载本地化消息。

简单的示例:

  1. 在属性文件中定义不同语言环境的消息(例如 messages_en.properties 和 messages_fr.properties):
  • messages_en.properties:
    greeting=Hello!
    
  • messages_fr.properties:
    greeting=Bonjour!
    
  1. 创建一个 Spring Bean,并注入 MessageSource:
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.MessageSource;
    import org.springframework.stereotype.Component;import java.util.Locale;@Component
    public class GreetingService {private final MessageSource messageSource;@Autowiredpublic GreetingService(MessageSource messageSource) {this.messageSource = messageSource;}public void printGreeting(Locale locale) {String greeting = messageSource.getMessage("greeting", null, "Default Greeting", locale);System.out.println(greeting);}
    }
    
  2. 在应用程序中使用 GreetingService:
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Locale;public class MainApp {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);GreetingService greetingService = context.getBean(GreetingService.class);greetingService.printGreeting(Locale.US); // Output: Hello!greetingService.printGreeting(Locale.FRENCH); // Output: Bonjour!context.close();}
    }
    
    在上面的示例中,GreetingService 中的 printGreeting 方法会根据传入的 locale 参数获取对应的消息。如果指定的消息未找到,将会返回默认的消息(“Default Greeting”)。

总结
通过 MessageSource,我们可以轻松实现多语言支持,使得应用程序可以根据不同用户的语言偏好提供合适的本地化文本信息。

ResourcePatternResolver

它是 Spring 核心框架的一部分,提供了一种方便的方式来定位资源,例如文件、类路径资源、URL 等,基于给定的模式。
Spring Framework 提供了多种 ResourcePatternResolver 接口的实现,以支持不同的资源定位策略。其中一些常用的实现包括:

  • PathMatchingResourcePatternResolver:这是在 Spring 应用程序中最常用的实现。它可以使用 Ant 风格的路径匹配模式来解析资源,例如 classpath*:com/example/**/*.xml,用于查找 com/example/ 包及其子包中的所有 XML 文件。

  • ServletContextResourcePatternResolver:此实现特定于 Web 应用程序,并允许您相对于 ServletContext 来解析资源。

  • FileSystemResourcePatternResolver:此解析器允许您使用文件系统路径来解析资源,在需要处理类路径之外的资源时很有用。

ResourcePatternResolver 接口提供了几种资源解析的方法,例如 getResources(String locationPattern) 可以获取与指定模式匹配的资源列表,getResource(String location) 可以根据位置获取单个资源等。

Spring 应用程序中使用 ResourcePatternResolver 的示例:

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.io.IOException;public class ResourceResolverExample {public static void main(String[] args) {// 创建资源解析器PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();try {// 使用 Ant 风格的模式解析资源Resource[] resources = resourceResolver.getResources("classpath*:com/example/**/*.xml");// 处理资源for (Resource resource : resources) {System.out.println("资源:" + resource.getFilename());// 在此处处理资源}} catch (IOException e) {// 处理异常e.printStackTrace();}}
}

ApplicationEventPublisher

它是 Spring 的事件驱动编程模型的一部分,可以在Sring应用程序中发布一些事件,对于订阅该特定类型的事件的的相关组件都可以订阅这些事件。允许 Spring 应用程序内的组件以松散耦合的方式进行通信和交互,通过事件来实现。

  1. 创建一个事件类
// 创建一个事件类
import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);}// 根据需要添加自定义属性和方法。
}
  1. 创建一个事件发布者
// 创建一个事件发布者
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;public class CustomEventPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher eventPublisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void doSomethingAndPublishEvent() {// 做一些重要的事情...// 创建并发布事件CustomEvent customEvent = new CustomEvent(this);eventPublisher.publishEvent(customEvent);}
}
  1. 创建一个事件监听器
// 创建一个事件监听器:
import org.springframework.context.ApplicationListener;public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 在这里处理自定义事件// 当事件被发布时,该方法将被调用。}
}
  1. 将监听器和发布器注入到容器中
<bean id="customEventPublisher" class="com.example.CustomEventPublisher" />
<bean id="customEventListener" class="com.example.CustomEventListener" />

ListableBeanFactory

ListableBeanFactory还提供了一些用于查询和获取Bean的扩展方法,使得可以方便地获取容器中的所有Bean或按条件进行Bean的查找。

主要的方法包括:

  • getBeanDefinitionCount(): 返回容器中注册的Bean定义的数量。

  • getBeanDefinitionNames(): 返回容器中所有注册的Bean的名称列表。

  • getBeanNamesForType(Class<?> type): 根据给定的类型返回对应的Bean名称列表。

  • getBeansOfType(Class type): 返回容器中给定类型的Bean实例的映射,其中Key为Bean名称,Value为对应的Bean实例。

这些方法使得开发人员可以很方便地根据类型或名称来获取容器中的Bean,而不需要手动遍历整个Bean定义列表。

示例:

假设我们有以下的两个Bean类,使用注解的示例:

@Component
public class User {// ...
}@Component
public class Product {// ...
}

然后,我们可以通过ListableBeanFactory来获取容器中的所有Bean或按类型获取Bean:

import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainApp {public static void main(String[] args) {ListableBeanFactory context = new AnnotationConfigApplicationContext(MainApp.class);// 获取容器中所有Bean的名称String[] beanNames = context.getBeanDefinitionNames();for (String beanName : beanNames) {System.out.println("Bean Name: " + beanName);}// 按类型获取BeanMap<String, User> users = context.getBeansOfType(User.class);for (Map.Entry<String, User> entry : users.entrySet()) {System.out.println("User Bean Name: " + entry.getKey());}}
}

HierarchicalBeanFactory

HierarchicalBeanFactory定义了一种层次结构,可以用于组织和管理多个BeanFactory实例,从而构建更复杂的容器结构。
在Spring中,HierarchicalBeanFactory接口主要用于以下两种场景:

  • 层次性的Bean查找:如果有多个BeanFactory层次相嵌套,可以通过层次性的Bean查找来从一个容器中查找Bean,如果找不到,则会递归地向上级容器查找,直到找到或者到达根容器。
  • 属性覆盖:层次性的BeanFactory允许子容器覆盖父容器中的Bean定义。在子容器中可以定义一个与父容器相同ID的Bean定义,从而覆盖父容器中的对应Bean。

通常情况下,ApplicationContext接口实现了HierarchicalBeanFactory接口,因此,ApplicationContext可以利用HierarchicalBeanFactory提供的功能。
如何使用层次性的BeanFactory:

import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;public class MainApp {public static void main(String[] args) {// 创建父容器,并加载配置文件beans-parent.xmlHierarchicalBeanFactory parentBeanFactory = new XmlBeanFactory(new ClassPathResource("beans-parent.xml"));// 创建子容器,并加载配置文件beans-child.xmlXmlBeanFactory childBeanFactory = new XmlBeanFactory(new ClassPathResource("beans-child.xml"), parentBeanFactory);// 在子容器中获取名为"user"的BeanUser user = (User) childBeanFactory.getBean("user");// 调用User的方法user.greet();}
}

EnvironmentCapable

是一个表示应用程序当前运行环境的接口。它可以用于获取配置属性、激活的配置文件、配置文件的属性值等。Spring 应用程序可以有多个不同的环境,例如开发、测试、生产环境等,并且根据不同环境进行配置和运行。
EnvironmentCapable 接口定义了一个方法:

Environment getEnvironment();

实现该接口的类需要提供这个方法的具体实现,以返回一个 Environment 实例。通过实现此接口,对象可以获取与应用程序配置相关的环境信息,并相应地调整其行为。
示例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.Environment;public class EnvironmentExample {public static void main(String[] args) {// 创建并初始化 Spring 应用程序上下文ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取环境信息Environment environment = context.getEnvironment();// 获取配置属性值String propertyValue = environment.getProperty("app.name");System.out.println("应用程序名称:" + propertyValue);}
}

ResourceLoader

它是 Spring 的资源加载机制的核心接口,提供了一种统一的方式来获取不同类型的资源,如文件、类路径资源、URL 等。
ResourceLoader 接口定义了一个方法:

Resource getResource(String location);

实现该接口的类需要提供这个方法的具体实现,以根据给定的资源位置(location)加载相应的资源。Resource 是 Spring 框架中另一个重要的接口,它代表一个可访问的资源,可以是文件、类路径资源、URL 等。

Spring 提供了多个实现 ResourceLoader 接口的类,包括:

  • DefaultResourceLoader: 默认的资源加载器,用于加载资源,支持类路径资源、文件系统资源等。
  • ClassPathResourceLoader: 用于加载类路径资源。
  • ServletContextResourceLoader: 用于在 Web 应用程序中加载 ServletContext 资源。
  • UrlResourceLoader: 用于加载 URL 资源。
  • 其他自定义的实现类,根据需要加载其他类型的资源。

在 Spring 应用程序中,通常通过 ResourceLoader 来加载资源,以获得更灵活的资源管理和访问方式。这样可以使代码与具体的资源位置解耦,并且能够轻松地在不同环境中切换资源的加载方式。

以下是一个简单的示例,展示如何使用 ResourceLoader 接口加载资源:

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.DefaultResourceLoader;public class ResourceLoaderExample {public static void main(String[] args) {// 创建资源加载器ResourceLoader resourceLoader = new DefaultResourceLoader();// 加载资源Resource resource = resourceLoader.getResource("classpath:example.txt");// 判断资源是否存在if (resource.exists()) {// 处理资源// ...} else {System.out.println("资源不存在。");}}
}

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

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

相关文章

python结合tesseract-ocr识别汉字的训练库过程

一、安装python 例如&#xff0c;安装路径为&#xff1a;C:\rtkapp\python-3.8.0 二、安装opencv 三、安装tesseract-ocr 安装完成后&#xff0c;在系统环境变量path中&#xff0c;添加安装路径C:\rtkapp\Tesseract-OCR 四、打开python安装pytesseract 五、安装java运行环境…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量&#xff0c;最初以为是预测人体体重&#xff0c;实际测试过程中才发现是评估人脸图片质量&#xff0c;主要调用Detect函数执行图片质量检测操作&#xff0c;其函数原型如下所示&#xff1a; //// 摘要:// 人脸质量评估///…

webstorm配置less转译

Program中路径如果识别不到 项目文件\node_modules.bin\lessc

springCloud Eureka注册中心配置详解

1、创建一个springBoot项目 2、在springBoot项目中添加SpringCloud依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>…

【MySQL数据库备份】

目录 一、概述 二、数据备份的重要性 1. 数据保护 2. 灾难恢复 3. 数据完整性 4. 合规性要求 三、造成数据丢失的原因 1. 硬件故障 2. 人为错误 3. 黑客攻击 4. 自然灾害 5. 软件故障 四、备份类型 1.物理与逻辑角度 1.1 概念 1.2 物理备份 1.2.1 冷备份 1.2…

Flutter:滑动面板

前言 无意中发现了这个库&#xff0c;发现现在很多app中都有类似的功能。以手机b站为例&#xff0c;当你在看视频时&#xff0c;点击评论&#xff0c;视频会向上偏移&#xff0c;下方划出评论界面。 sliding_up_panel SlidingUpPanel是一个Flutter插件&#xff0c;用于创建滑…

Stable Diffusion 硬核生存指南:WebUI 中的 VAE

本篇文章聊聊 Stable Diffusion 生态中呼声最高、也是最复杂的开源模型管理图形界面 “stable-diffusion-webui” 中和 VAE 相关的事情。 写在前面 Stable Diffusion 生态中有一个很重要的项目&#xff0c;它对于 SD 生态繁荣做出的贡献可以说居功至伟&#xff0c;自去年八月…

13. Mybatis-Plus

目录 1. MyBatis-Plus 简介 2. 新建项目 3. 添加依赖 4. 配置数据库 5. 编码 1. MyBatis-Plus 简介 通过官网&#xff1a;MyBatis-Plus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyB…

W2NER详解

论文&#xff1a;https://arxiv.org/pdf/2112.10070.pdf 代码&#xff1a;https://github.com/ljynlp/W2NER 文章目录 W2NER介绍模型架构解码 源码介绍数据输入格式模型代码 参考资料 W2NER 介绍 W2NER模型&#xff0c;将NER任务转化预测word-word&#xff08;备注&#xff…

微信小程序生成带参数的二维码base64转png显示

getQRCode() {var that this;wx.request({url: http://localhost:8080/getQRCode?ID 13,header: {content-type: application/json},method: POST,responseType: arraybuffer,//将原本按文本解析修改为arraybuffersuccess(res) {that.setData({getQRCode: wx.arrayBufferToB…

string【2】模拟实现string类

string模拟实现 引言&#xff08;实现概述&#xff09;string类方法实现默认成员函数构造函数拷贝构造赋值运算符重载析构函数 迭代器beginend 容量size、capacity、emptyreserveresize 访问元素operator[] 修改insert插入字符插入字符串 appendpush_backoperatoreraseclearswa…

uni-app在小米手机上运行【步骤细节】

注意细节重点&#xff1a; 1.手机使用数据线与电脑连接&#xff0c;手机连接模式必须是传输文件模式 2.手机必须打开开发者模式 3.打开开发者模式后&#xff0c;仔细浏览并调整USB调试权限&#xff0c;重点打开USB是否允许安装按钮&#xff01;&#xff01;&#xff01; 操作步…

RWEQ模型参量提取

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff0c;占国土总面积的16.7%&#xff0c;严重影响这些地区的资源开发和社会经…

windows环境下,安装elasticsearch

目录 前言准备安装 jdk 安装nodejsElasticSearch下载ElasticSearch-head 下载 安装ElasticSearch安装ElasticSearch-head插件设置用户名密码访问ElasticSearch 默认用户名和密码参考 前言 win10elasticsearch 8.9.0 准备 安装 jdk ElasticSearch 是基于lucence开发的&#…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单&#xff0c;见谅哇&#xff0c;今日更新内容&#xff1a; part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅&#xff0c;有很多有意思的图形的R语言复现&#xff01;&#xff01;)做了这样一张图&#xff1a; 感觉很…

docker简单web管理docker.io/uifd/ui-for-docker

要先pull这个镜像docker.io/uifd/ui-for-docker 这个软件默认只能使用9000端口&#xff0c;别的不行&#xff0c;因为作者在镜像制作时已加入这一层 刚下下来镜像可以通过docker history docker.io/uifd/ui-for-docker 查看到这个端口已被 设置 如果在没有设置br0网关时&…

视频标注是什么?和图像数据标注的区别?

视频数据标注是对视频剪辑进行标注的过程。进行标注后的视频数据将作为训练数据集用于训练深度学习和机器学习模型。这些预先训练的神经网络之后会被用于计算机视觉领域。 自动化视频标注对训练AI模型有哪些优势 与图像数据标注类似&#xff0c;视频标注是教计算机识别对象…

【解惑笔记】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)

【学习资料】 子豪兄的零基础树莓派教程https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95…

Flink - souce算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 从Java的集合中读取数据 2. 从本地文件中读取数据 3. 从HDFS中读取数据 4. 从Socket中读取数据 5. 从Kafka中读取数据 6. 自定义Source 官方文档 - Flink1.13 1. 从Java的集合中读取数据 …

Vue 3:玩一下web前端技术(一)

前言 本章内容为VUE前端环境搭建与相关前端技术讨论。 下一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;二&#xff09;_Lion King的博客-CSDN博客 一、环境搭建 1. 安装Node.js Vue是基于Node.js的&#xff0c;因此首先需要安装Node.js。官网…