Spring揭秘:Environment接口应用场景及实现原理!

news2024/7/4 4:57:02

Spring揭秘:Environment接口应用场景及实现原理! - 程序员古德

内容概要

Environment接口提供了强大且灵活的环境属性管理能力,通过它,开发者能轻松地访问和配置应用程序运行时的各种属性,如系统属性、环境变量等。

同时,Environment接口还支持属性源的定制和扩展,使得开发者能根据实际需求灵活地定制属性的加载和解析方式。

核心概念

它能解决了什么问题?

Environment接口在Spring框架主要负责管理和提供应用程序运行时的环境信息,这些信息包括但不限于系统属性、环境变量、命令行参数、配置文件属性等。

以下是Environment接口主要用来解决的一些技术问题:

  1. 属性管理Environment提供了访问应用程序属性的集中机制,可以使用它来读取、设置和管理这些属性,这些属性可以来自不同的源,如系统属性、环境变量、配置文件(如properties或yml文件)等。
  2. 配置灵活性:通过使用Environment,开发者可以在运行时动态地改变或覆盖配置,这增加了配置的灵活性和可定制性,对于需要根据不同环境(如开发、测试、生产等)进行不同配置的应用程序来说尤为重要。
  3. 简化配置访问:在Spring应用程序中,可能需要访问各种配置值,Environment简化了这一过程,通过提供统一且易于使用的API,可以轻松地从代码中访问这些配置值。
  4. 配置源整合:Spring的Environment能够将来自不同源的配置信息整合到一起,提供了一个统一的视图来访问这些配置,这意味着,无论配置信息是存储在系统属性、环境变量还是配置文件中,都可以使用相同的方式来访问它们。
  5. 属性占位符解析Environment还支持属性占位符的解析,这允许在配置中使用占位符来引用其他属性的值,这对于创建基于其他属性值的配置特别有用。
  6. 支持Spring表达式语言:在一些高级用例中,可能需要使用Spring表达式语言(SpEL)来访问或操作配置数据。Environment与SpEL的集成使得这种操作变得更加简单和直接。

它有哪些子类拓展

image-20240311193232629

如上图所示,Environment接口有多个实现类,这些实现类根据用途和配置源的不同而有所区分,以下是Environment接口的一些主要实现类:

  1. StandardEnvironment
    这是Environment接口的最基本实现,用于非Web应用程序,它主要管理JVM级别的系统属性和环境变量,通常,在创建独立的Java应用程序或命令行工具时会使用StandardEnvironment
  2. StandardServletEnvironment
    这是用于基于Servlet的Web应用程序的Environment实现,除了系统属性和环境变量外,它还考虑了Servlet规范定义的配置参数,如Servlet上下文初始化参数和JNDI属性,在Spring MVC应用程序中,通常会使用StandardServletEnvironment
  3. ConfigurableEnvironment
    这是一个可以配置和修改的Environment实现,它通常用作其他更具体环境实现的基类,如StandardEnvironmentAbstractEnvironment。它允许添加、删除或修改属性源(PropertySource)。
  4. ConfigurableWebEnvironment:提供了一个专门用于Web应用程序的环境接口,它扩展了ConfigurableEnvironment接口,这个接口的主要作用是为Web应用程序提供配置环境的能力,同时添加了一些与Web环境相关的特性。

个人思考

ConfigurableEnvironmentConfigurableWebEnvironment有什么区别?

他们都是Spring框架中用于配置和管理应用程序运行环境的接口,然而,它们之间存在一些关键的区别,主要在于它们的应用场景和提供的功能:

1、应用场景

  • ConfigurableEnvironment:这是Spring框架中用于配置和管理通用应用程序环境的接口,它可以用于任何类型的应用程序,无论是Web应用程序还是非Web应用程序。
  • ConfigurableWebEnvironment:这个接口是专门为Web应用程序设计的,用于配置和管理Web应用程序的运行环境,它扩展了ConfigurableEnvironment接口,添加了一些与Web环境相关的特性。然而,需要注意的是,在较新版本的Spring框架中(如Spring 5及以后),ConfigurableWebEnvironment接口实际上已经被废弃,而推荐使用ConfigurableEnvironment来处理Web和非Web环境的配置,但在旧版本的Spring中,这个接口仍然存在并用于区分Web和非Web环境。

2、提供的功能

  • ConfigurableEnvironment:这个接口提供了一组方法来配置和管理应用程序的环境属性,可以通过它添加、删除或修改属性源,并定制属性的检索顺序,此外,它还提供了访问和修改系统属性、环境变量等功能。
  • ConfigurableWebEnvironment:除了继承自ConfigurableEnvironment的所有功能外,这个接口还提供了对Servlet上下文初始化参数的访问,这是Web应用程序特有的功能,允许在Web应用程序的运行环境中访问和修改Servlet上下文的初始化参数,由于该接口在较新版本的Spring中已被废弃,因此在实际开发中可能不会直接使用它

代码案例

下面代码演示了几个使用频率较高的Environment代码案例。

StandardEnvironment案例

下面是一个简单的Java代码示例,演示了如何使用org.springframework.core.env.StandardEnvironment类。

这个示例创建了一个StandardEnvironment实例,并通过它访问了系统属性和环境变量。

import org.springframework.core.env.StandardEnvironment;  
  
public class StandardEnvironmentExample {  
  
    public static void main(String[] args) {  
        // 创建一个StandardEnvironment实例  
        StandardEnvironment environment = new StandardEnvironment();  
  
        // 获取系统属性"java.version"  
        String javaVersion = environment.getSystemProperties().getProperty("java.version");  
        System.out.println("Java Version: " + javaVersion); // 输出Java版本信息  
  
        // 获取环境变量"PATH"(注意:环境变量的名称可能因操作系统而异)  
        String pathVariable = environment.getSystemEnvironment().get("PATH");  
        // 在Windows上,PATH环境变量的分隔符是";",在Unix/Linux上是":"  
        String pathSeparator = System.getProperty("path.separator");  
        if (pathVariable != null) {  
            System.out.println("PATH Environment Variable (first entry): " + pathVariable.split(pathSeparator)[0]);  
            // 输出PATH环境变量的第一个条目(根据路径分隔符分割后)  
        } else {  
            System.out.println("PATH Environment Variable is not set.");  
        }  
  
        // 尝试获取一个不存在的系统属性或环境变量将返回null  
        String nonExistentProperty = environment.getSystemProperties().getProperty("non.existent.property");  
        System.out.println("Non-Existent Property: " + nonExistentProperty); // 输出null或未定义属性的信息  
    }  
}

在这段代码中,创建了一个StandardEnvironment的实例,然后,使用getSystemProperties()方法获取系统属性,并通过getProperty()方法获取特定的属性(在这个例子中是"java.version")。

类似地,使用getSystemEnvironment()方法获取环境变量,并通过get()方法获取特定的环境变量(在这个例子中是"PATH")。请注意,环境变量的名称和可用性可能因操作系统而异。

注意,如果是非Web应用程序则推荐使用StandardEnvironment,如果是Web应用程序,则推荐使用StandardServletEnvironment

ConfigurableEnvironment案例

下面是一个使用org.springframework.core.env.ConfigurableEnvironment类的Java代码示例。

在这个示例中,创建一个ConfigurableEnvironment实例,并向其添加自定义的属性源。=,然后,将演示如何从环境中检索这些属性。

import org.springframework.core.env.ConfigurableEnvironment;  
import org.springframework.core.env.MapPropertySource;  
import org.springframework.core.env.Environment;  
  
import java.util.HashMap;  
import java.util.Map;  
  
public class ConfigurableEnvironmentExample {  
  
    public static void main(String[] args) {  
        // 创建一个ConfigurableEnvironment实例  
        ConfigurableEnvironment environment = new ConfigurableEnvironment();  
  
        // 创建一个包含自定义属性的Map  
        Map<String, Object> customProperties = new HashMap<>();  
        customProperties.put("custom.property.one", "Value One");  
        customProperties.put("custom.property.two", "Value Two");  
  
        // 创建一个属性源,并命名为"customProperties"  
        MapPropertySource customPropertySource = new MapPropertySource("customProperties", customProperties);  
  
        // 将自定义属性源添加到环境中  
        environment.getPropertySources().addLast(customPropertySource);  
  
        // 从环境中检索自定义属性并打印它们  
        String propertyOne = environment.getProperty("custom.property.one");  
        String propertyTwo = environment.getProperty("custom.property.two");  
  
        System.out.println("Custom Property One: " + propertyOne); // 输出: Custom Property One: Value One  
        System.out.println("Custom Property Two: " + propertyTwo); // 输出: Custom Property Two: Value Two  
  
        // 尝试获取一个不存在的属性将返回null  
        String nonExistentProperty = environment.getProperty("non.existent.property");  
        System.out.println("Non-Existent Property: " + nonExistentProperty); // 输出: Non-Existent Property: null  
    }  
}

在这段代码中,创建了一个ConfigurableEnvironment实例,然后,创建了一个包含自定义属性的Map,并使用这个Map创建了一个MapPropertySource实例,将这个自定义属性源命名为"customProperties",并将其添加到环境的属性源列表的末尾。

接着,使用environment.getProperty()方法从环境中检索自定义属性,并将它们打印到控制台。最后,尝试获取一个不存在的属性,以演示当属性不存在时返回null的情况。

关注我,每天学习互联网编程技术 - 程序员古德

END!
END!
END!

往期回顾

精品文章

Spring揭秘:Aware接口应用场景及实现原理!

Spring揭秘:@import注解应用场景及实现原理!

Spring揭秘:ImportBeanDefinitionRegistrar应用场景及实现原理!

Java并发基础:原子类之AtomicMarkableReference全面解析!

Java并发基础:concurrent Flow API全面解析

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

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

相关文章

20240309web前端_第一周作业_完成电子汇款单

作业二&#xff1a;完成电子汇款单 成果展示: 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

算法-状数组与线段树-1264. 动态求连续区间和

题目 思路 线段树&树状数组 - AcWing算法学习笔记(14): 线段树 - 知乎 (zhihu.com) 代码 Python超时版 def calculate_subarray_sum(nums, a, b):return sum(nums[a-1:b])n, m map(int, input().split()) nums list(map(int, input().split()))for _ in range(m):op,…

社交媒体革新者:揭秘Facebook对在线互动的影响

1. Facebook的兴起与发展 Facebook由马克扎克伯格在哈佛大学宿舍创建&#xff0c;最初只是服务于哈佛大学学生的社交网络。然而&#xff0c;其后快速扩张到其他大学和全球&#xff0c;成为了全球最大的社交媒体平台之一。其发展历程不仅是数字时代的典范&#xff0c;也是创业成…

地球的纬度和中国在地球上大概位置

每次都忘记,做一个比较画一张图下次看见一下就能想起 (中国在北纬和南纬) N 表示北纬&#xff0c;范围是 0 到 90。北纬是正数 S 表示南纬&#xff0c;范围也是 0 到 -90&#xff0c;但南纬是负数 (中国在东经) E 表示东经&#xff0c;范围是 0 到 180 东经是正数 W 表示西经&a…

Nginx七层的负载均衡使用keepalived实现高可用

目录 一、环境准备 二、两台nginx服务器作为代理服务器,配置nginx的负载均衡 三、Keepalived实现调度器 Proxy-master 与 Proxy-slave机器同时操作安装 备份配置文件 编辑主Proxy-master的配置文件 编辑从 Proxy-slaver的配置文件 四、 启动KeepAlived&#xff08;主备…

如何在Linux使用Docker部署Firefox并实现无公网IP访问本地浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Unity笔记:C#基础(1)

杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中&#xff0c;string是不可变的&#xff0c;这意味着对string对象的操作通常会返回一个新的string对象&#xff0c;而不会修改原始的string对象。因此&#xff0c;几乎所有涉及更改string内…

安装zabbix

部署Zabbix监控平台 部署一台Zabbix监控服务器&#xff0c;一台被监控主机&#xff0c;为进一步执行具体的监控任务做准备&#xff1a; 安装LNMP环境源码安装Zabbix安装监控端主机&#xff0c;修改基本配置初始化Zabbix监控Web页面修改PHP配置文件&#xff0c;满足Zabbix需求…

IP形象设计是什么设计?如何做?

随着市场竞争的激烈&#xff0c;越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中&#xff0c;知识产权形象设计是一个非常重要的方面。在智能和互联网的趋势下&#xff0c;未来的知识产权形象设计可能更加关注数字和社交网络。通过数字技术和社交媒体平台&#xff0…

vue本地实现生成二维码功能

首先导入依赖 npm install qrcode --save-dev然后是页面代码 <template><div><canvas ref"qrcodeCanvas"></canvas></div> </template><script> import QRCode from qrcode;export default {mounted() {this.generateQR…

(2023)从零开始用qemu搭建虚拟arm环境

用qemu搭建虚拟arm环境 引言安装版本 1. VMware ubuntu20.04 qemu安装2.安装交叉编译工具3.编译内核kernel4.u-boot编译5.制作根文件系统第一步&#xff1a;下载、编译和安装busybox第二步&#xff1a;形成根目录结构第三步&#xff1a;制作根文件系统镜像 测试HelloWorld应用…

Servlet API 详细讲解

Servlet API 详细讲解 文章目录 Servlet API 详细讲解1. HttpServlet2.HttpServletRequest服务器如何获取到 query string 和 body 的数据 &#xff1f;&#xff1f; 3.HttpServletResponse API就是一组类和方法的集合&#xff0c;servlet 中的 类是非常多的&#xff0c;咱们只…

Python实现图片(合并)转PDF

在日常的工作和学习过程当中,我相信很多人遇到过这样一个很普通的需求,就是将某一个图片转为PDF或者是将多个图片合并到一个PDF文件。但是,在苦苦搜寻一圈之后发现要么要下载软件,下载了还要注册,注册了还要VIP,甚至SVIP才能实现这样的需求! 今天,我带大家把这个功能打…

【学习笔记】VMware vSphere 6.7虚拟化入门

VMware vSphere 6.7虚拟化入门课程介绍 课程内容 1、VMware vSphere 6.7虚拟化入门课程介绍 2、ESXi6.7控制台设置 3、使用vSpkere Host client管理虚拟机 4、VMware EsXi基础操作 5、VMware Esxi存储管理 6、管理ESXi主机网络与虚拟机网络 7、安装配置vCenter Server Applia…

neo4j网页无法打开,启动一会儿后自动关闭,查看neo4j status显示Neo4j is not running.

目录 前情提要User limit of inotify watches reached无法访问此网站 前情提要 公司停电&#xff0c;服务器未能幸免&#xff0c;发现无法访问此网站&#xff0c;http://0.0.0.0:7474 在此之前都还好着 User limit of inotify watches reached (base) [rootlocalhost ~]# n…

利用MyRandom函数求一组指定个数的随机返回数

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

搭建prometheus、grafana监控平台

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【Qt】—— 信号与槽

目录 &#xff08;一&#xff09;信号和槽概述 1.1 信号的本质 1.2 槽的本质 &#xff08;二&#xff09;信号和槽的使用 2.1 信号和槽的连接 2.2 查看内置信号和槽 2.3 通过Qt Creator⽣成信号槽代码 &#xff08;三&#xff09;自定义信号和槽 3.1 基本语法 3.2 带参…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

产品设计 - 尼尔森交互设计原则

文章目录 前言1. 状态可见原则1.1 理论介绍1.2 实践应用 2. 环境贴切原则2.1 理论介绍2.2 实践应用 3. 用户可控原则3.1 理论介绍3.2 实践应用 4. 一致性原则4.1 理论介绍4.2 实践应用 5. 易用原则5.1 理论介绍5.2 实践应用 6. 灵活高效原则6.1 理论介绍6.2 实际应用 7. 优美简…