首页 > 编程语言 >[Java/Spring] 深入理解 : Spring BeanFactory / ApplicationContext、Environment、PropertySource 、MessageSour

[Java/Spring] 深入理解 : Spring BeanFactory / ApplicationContext、Environment、PropertySource 、MessageSour

时间:2024-10-10 16:46:13浏览次数:1  
标签:ApplicationContext Spring springframework ResourcePatternResolver 接口 org

  • PropertySource : 解析环境资源及配置的底层组件
  • org.springframework.core.env.PropertyResolver
  • Environment : 管理环境的配置与资源
  • org.springframework.core.env.Environment
  • 其继承接口 PropertyResolver 属性解析器,用来解析不同属性源 PropertySource 里的 key-value。
  • org.springframework.core.env.AbstractEnvironment implements ConfigurableEnvironment
  • 实现子类 :
  • org.springframework.core.env.StandardEnvironment extends AbstractEnvironment
  • org.springframework.boot.web.reactive.context.StandardReactiveWebEnvironment extends StandardEnvironment implements ConfigurableReactiveWebEnvironment
  • org.springframework.web.context.support.StandardServletEnvironment extends StandardEnvironment implements ConfigurableWebEnvironment
  • 内部属性 :
private final Set<String> activeProfiles = new LinkedHashSet<>();

private final Set<String> defaultProfiles = new LinkedHashSet<>(getReservedDefaultProfiles());

private final MutablePropertySources propertySources = new MutablePropertySources();

private final ConfigurablePropertyResolver propertyResolver = new PropertySourcesPropertyResolver(this.propertySources);
  • 与 environment 关系
Environment -> ConfigurableEnvironment -> AbstractEnvironment -> StandardEnvironment -> StandardReactiveWebEnvironment: 父子层次

ConfigurableEnvironment -> MutablePropertySources: 获取可变多个配置源 ( ConfigurableEnvironment#getPropertySources() )

MutablePropertySources extends PropertySources ( PropertySources extends Iterable<PropertySource<?>> ) : 包含多个 PropertySource
  • BeanFactory : Spring IOC 容器的顶级抽象接口
  • org.springframework.beans.factory.BeanFactory
  • BeanFactory 中 Bean 的生命周期
  • 2个重要的后置处理器: BeanFactoryPostProcessor、BeanPostProcessor

  • ApplicationContext : Spring IOC 容器的默认实现、基于 Environment 创建 上下文、跨语言/地区支持、应用事件发布支持、
  • org.springframework.context.ApplicationContext
  • ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
  • org.springframework.context.support.AbstractApplicationContext
  • ApplicationContext 本质是一个维护 Bean 定义以及对象之间协作关系的接口,或者说为应用 application 提供配置的核心接口。

1、Bean 容器(ListableBeanFactory / HierarchicalBeanFactory).

ApplicationContext 继承 ListableBeanFactory 和 HierarchicalBeanFactory ,实现了 Bean 的生命周期管理(BeanFactoy)、有序性(ListableBeanFactory)和层次性(HierarchicalBeanFactory),并进行扩展。
Spring也为我们提供了 ApplicationContext 的多种类型的容器实现,供我们在不同的应用场景选择。例如:

AnnotationConfigApplicationContext:从一个或多个基于 Java 的配置类中加载上下文定义,适用于 Java 注解的方式
AnnotationConfigWebApplicationContext:专门为 web 应用准备的,适用于注解方式

2、ApplicationContext 继承 EnvironmentCapable 接口:

带有Capable后缀的接口在Spring中带有getXXX的含义,也就是实现了这个接口,就可以通过该接口的实例获取到XXX,这个和Aware接口很类似

换言之,通过 ApplicationContext 可获得 Environment 对象。
所有的Spring应用上下文都实现了 EnvironmentCapable 接口, 这个接口主要用于检查接受了 BeanFactory 接口的框架方法,不管这些接口是不是 ApplicationContext ,为了与 environment 交互,如果这些接口确实是可用的。
例如: (new ClassPathXmlApplicationContext("bean.xml") ).getEnvironment().getProperty("key");

在 Spring Boot 的启动方法 run() 我们可以看到 Spring Boot 根据当前应用环境 webApplicationType 决定创建相应的 ConfigurableApplicationContext 对象
run() 内的 prepareEnvironment 监听 ApplicationEnvironmentPreparedEvent 事件,由 listeners 处理,然后 createApplicationContext() 创建上下文

3、跨语言/地区支持(MessageSource)

4、应用事件发布支持(ApplicationEventPublisher)

5、资源模式解析支持(ResourcePatternResolver)

  • MessageSource
org.springframework.context.MessageSource;

public interface MessageSource {
    @Nullable
    String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
    String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
    String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}

Use Demo

code = "application.version";
Locale locale = getUserLocale(httpRequest); // Locale对象标定了当前使用哪种语言
text = messageSource.getMessage(code, locale);
  • ApplicationEventPublisher : 应用事件发布支持
public interface ApplicationEventPublisher {
 
    default void publishEvent(ApplicationEvent event) {
        publishEvent((Object) event);
    }
 
    void publishEvent(Object event);
}

事件发布是一种编程模式,是回调编程的一个变种。具体而言,就是我们可以在Spring上发布一个事件,然后Spring会寻找这个容器的监听器,然后调用监听器的代码。
例如,Spring 应用关闭后,会发布一个应用关闭事件。 应用代码可以注册这个事件的监听器, 处理一些资源关闭事件。
但这个模式最强的地方在于,它能把业务逻辑流程高度抽象起来,然后在这些抽象的流程中间插入事件发布。

例如一个订单业务,遵循下单-付款-发货-收货,即可以抽象出对应的事件,如果我们想在用户下单时,弹出一些优惠提示,我们就可以注册一个下单事件的监听器来进行这个工作。一旦优惠截止,只需要卸载这个监听器即可。
事件流描述了一个应用逻辑流程的生命周期各个重要的节点。
所以经常的,当你发现只要是涉及生命周期这个话题时,事件出镜率总是非常高。
事实上,对于这个模式强编码出类似于"publish"和"event"的描述,确实有些过度抽象的嫌疑。

  • ResourcePatternResolver : 资源模式解析器

一个ResourcePatternResolver是一个ResourceLoader。但前者比后者比多一个模式匹配的接口。通常,我们认为一个资源位置字符串代表了一个资源,但一个模式字符串可以匹配多个资源。
Resource[] getResources(String locationPattern) throws IOException;

所谓资源,在java的定义中,是一段字节流。文件是一段命名字节流,网络消息是一段字节流,内存是一块大字节数组……诸如此类,Resource接口抽象出这些来源,提供共同的操作接口。即从应用代码的角度出发,你不再需要管它是一个File还是一个URI,只需要老实调用getInputStream()或readableChannel()方法就可以了。
Spring的配置文件就是通过 ResourcePatternResolver 读取的。触类旁通,你当然也可以通过它来获得你想要的文件,无论它在classpath下、一个本地文件还是一个网络位置。

X 参考文献

标签:ApplicationContext,Spring,springframework,ResourcePatternResolver,接口,org
From: https://www.cnblogs.com/johnnyzen/p/18456686

相关文章

  • Spring声明事务
    spring事务有2种用法:编程式事务和声明式事务。编程式事务上一篇文章中已经介绍了,不熟悉的建议先看一下编程式事务的用法。这篇主要介绍声明式事务的用法,我们在工作中基本上用的都是声明式事务,所以这篇文章是比较重要的,建议各位打起精神,正式开始。什么是声明式事务?所谓声明......
  • Spring是什么?我们为什么要学习它?
    环境jdk1.8ideamaven-3.6.1spring-5.2.3.RELEASE整个spring系列使用官方最新版本5.2.3.RELEASE,会有大量案例,都是通过maven来管理的,所以maven是必备技能,对这块不熟悉的可以去看一下:Maven系列为什么需要学习spring?最大程度的简化了开发spring是一个非常优秀的java框架,其目......
  • Spring事务管理与AOP代理的原理,默认的单例对象和代理对象销毁的时机
    Spring的事务管理是使用AOP(面向切面编程)代理的原理来实现的。Spring事务管理与AOP代理原理AOP代理的作用:在Spring中,AOP代理用于在目标对象的方法执行前后注入自定义的逻辑,这些逻辑通常与业务逻辑无关,但需要在业务逻辑执行时同步执行,如事务管理、日志记录、性能检测等。通过......
  • Java中常见的异常分类,结合Spring的事务巩固复习
    Java异常的继承关系是通过类继承的方式构建的一个层次结构。以下是对Java异常继承关系的详细图解说明:异常类的顶层Throwable:所有异常和错误的超类。Throwable的子类Error:通常是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将......
  • Spring Security(常见过滤器介绍)
    SpringSecurity是一个基于Spring框架的安全性解决方案,为Java应用程序提供了一套全面的安全解决方案。一、概述SpringSecurity是Spring采用AOP(面向切面编程)思想,基于servlet过滤器实现的安全框架。它致力于保护基于Spring的应用程序,并成为了这类应用的事实上的安全标准。S......
  • Spring事务的1道面试题
    每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。原理Spring事务的原理是:通过AOP切面的方式实现的,也就是通过代理模式去实现事务增强。具体过程是:对包含@Transactional注解的方法进行拦截,然后重写,重新在方法里加入异......
  • Springboot二手车估值与销售网络平台l0471(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表客户,汽车分类,车辆信息,车辆估价,商家开题报告内容一、研究背景随着汽车消费市场的不断扩大和二手车交易的增多,设计和实现一个二手车估值与销售网络平台具有重......
  • Springboot动漫图片分享网站k3r27(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,画手,图片分类,图片分享,求稿任务,接稿请求开题报告内容一、研究背景随着互联网技术的飞速发展和动漫文化的普及,越来越多的人开始分享和欣赏动漫图片。然......
  • 高效美发店运营:SpringBoot管理系统详解
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发合适的美发门店管理系统,可以方便管理人员对美发......
  • 【关注可白嫖源码】springboot基于微信小程序的二手书籍交易平台
    摘 要国内的京东商城、天猫、苏宁易购等大型网站在图书销售等商品零售领域已经十分成熟完善,但是以高校学生二手书为主的二手图书资源目前还没有得到合理的开发利用。本人设计和实现的基于微信小程序的二手书籍交易平台是通过合理的市场调查然后才着手实施的。系统分前端和......