Spring Boot 中的 Environment

news2024/10/4 4:17:00

Spring Boot 中的 Environment

在 Spring Boot 中,Environment 是一个重要的组件,用于管理应用程序的配置。它是一个接口,提供了访问应用程序配置属性的方法。在本文中,我们将深入探讨 Spring Boot 中的 Environment,包括它的原理和如何使用。

在这里插入图片描述

Environment 的原理

在 Spring Boot 中,Environment 是一个用于管理配置属性的接口。它提供了许多方法来获取配置属性,例如 getProperty()、getPropertySources() 和 getActiveProfiles() 等。在应用程序启动时,Spring Boot 会自动创建一个 Environment 实例,并使用它来加载应用程序的配置。

Environment 由多个 PropertySource 组成。每个 PropertySource 包含一组属性键值对,可以通过 getProperty() 方法来获取其中的属性值。当应用程序需要获取配置属性时,Spring Boot 会遍历 PropertySource 列表,并查找匹配的属性。

在 Spring Boot 中,有许多实现了 PropertySource 接口的类,例如 MapPropertySource、SystemEnvironmentPropertySource 和 CommandLinePropertySource 等。这些类可以用于加载不同的配置源,例如命令行参数、系统环境变量和配置文件等。

如何使用 Environment

在 Spring Boot 中,我们可以使用 Environment 来获取应用程序的配置属性。下面是一些常用的方法:

@Configuration
public class MyConfig {

    @Autowired
    private Environment env;

    @Bean
    public MyBean myBean() {
        String property = env.getProperty("my.property");
        return new MyBean(property);
    }
}

在上面的代码中,我们使用 @Autowired 注解将 Environment 注入到 MyConfig 类中。然后,在 myBean() 方法中,我们使用 getProperty() 方法来获取 my.property 属性的值,并将它传递给 MyBean 的构造函数。

除了 getProperty() 方法之外,Environment 还提供了许多其他有用的方法。例如,我们可以使用 getActiveProfiles() 方法来获取当前活动的配置文件,使用 getPropertySources() 方法来获取所有的 PropertySource,以及使用 containsProperty() 方法来检查属性是否存在等。

Environment 的高级用法

除了基本的用法之外,Environment 还提供了一些高级用法,例如添加和删除 PropertySource。

添加 PropertySource

在某些情况下,我们可能需要添加自定义的 PropertySource。例如,我们可以从数据库中加载配置属性,并将它们添加到 Environment 中。下面是一个示例:

@Configuration
public class MyConfig {

    @Autowired
    private Environment env;

    @Bean
    public PropertySource<?> myPropertySource() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("my.custom.property", "foo");
        return new MapPropertySource("myPropertySource", properties);
    }

    @Bean
    public MyBean myBean() {
        String property = env.getProperty("my.custom.property");
        return new MyBean(property);
    }
}

在上面的代码中,我们首先定义了一个名为 myPropertySource 的 PropertySource,它包含一个名为 my.custom.property 的属性。然后,在 myBean() 方法中,我们使用 getProperty() 方法来获取 my.custom.property 属性的值,并将它传递给 MyBean 的构造函数。

删除 PropertySource

如果我们需要删除一个 PropertySource,可以使用 MutablePropertySources 接口提供的 remove() 方法。例如,下面的代码演示了如何删除名为 myPropertySource 的 PropertySource:

@Configuration
public class MyConfig {

    @Autowired
    private ConfigurableEnvironment env;

    @Bean
    public PropertySource<?> myPropertySource() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("my.custom.property", "foo");
        return new MapPropertySource("myPropertySource", properties);
    }

    @PostConstruct
    public void removeMyPropertySource() {
        MutablePropertySources propertySources = env.getPropertySources();
        propertySources.remove("myPropertySource");
    }
}

在上面的代码中,我们首先定义了一个名为 myPropertySource 的 PropertySource。然后,在 removeMyPropertySource() 方法中,我们使用 ConfigurableEnvironment 接口来获取 MutablePropertySources,并使用 remove() 方法来删除 myPropertySource。

总结

在本文中,我们深入探讨了 Spring Boot 中的 Environment,包括它的原理和如何使用。Environment 是一个用于管理配置属性的接口,在应用程序启动时自动创建,并由多个 PropertySource 组成。我们可以使用 Environment 来获取应用程序的配置属性,并使用它提供的方法来获取活动的配置文件、所有的 PropertySource 以及检查属性是否存在等。除了基本的用法之外,Environment 还提供了一些高级用法,例如添加和删除自定义的 PropertySource。

通过了解 Environment 的原理和使用方法,我们可以更好地管理应用程序的配置,并提高代码的可维护性和可扩展性。因此,在编写 Spring Boot 应用程序时,我们应该充分利用 Environment,并根据实际需求来使用它的高级用法。

最后,附上示例代码,供读者参考和学习。

@Configuration
public class MyConfig {

    @Autowired
    private Environment env;

    @Bean
    public MyBean myBean() {
        String property = env.getProperty("my.property");
        return new MyBean(property);
    }

    @Bean
    public PropertySource<?> myPropertySource() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("my.custom.property", "foo");
        return new MapPropertySource("myPropertySource", properties);
    }

    @PostConstruct
    public void removeMyPropertySource() {
        MutablePropertySources propertySources = ((ConfigurableEnvironment) env).getPropertySources();
        propertySources.remove("myPropertySource");
    }
}

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

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

相关文章

Git基本操作总结

0.Git操作关系图 1.初次创建仓库 1)git ini&#xff08;初次提交时使用&#xff0c;项目中会生成.git文件&#xff09; 2)git add . 3)git commit -m “提交代码” 4)git remote add origin “http://xxx.git”&#xff08;关联远程主机&#xff09; / git remote rm origin …

服务器数据恢复-NetApp FAS存储误删文件夹的数据恢复案例

NetApp存储故障&分析&#xff1a; 某公司一台NetApp存储&#xff0c;工作人员误操作删除一个重要的文件夹。 虽然被删除已经有一段时间了&#xff0c;但是根据NetApp文件系统WAFL的特点&#xff0c;数据被覆盖的可能性不大。 NetApp存储数据恢复过程&#xff1a; 1、由于不…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第二十章 欺骗攻击及防御技术上)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、概述二、IP欺骗及防御技术1、基本的IP欺骗2、源路由攻击3、IP欺骗的高级应用——TCP会话劫持4、TCP三步握手连接建立5、TCP会话劫持过程6、IP欺骗攻击的防御7、防范源路由…

【实用工具】MapStruct—性能无限接近原生手写的对象转换工具

文章目录 优秀借鉴 1、引入2、什么是MapStruct2.1、概述2.2、横向对比2.3、优势 3、快速入门3.1、Maven3.2、POJO3.3、统一映射接口3.4、业务映射接口3.5、测试3.6、输出 4、简单分析5、拓展使用 优秀借鉴 What is a Data Transfer Object (DTO)?Java bean mappings, the easy…

多元回归预测 | Matlab北方苍鹰算法(NGO)优化极限学习机ELM回归预测,NGO-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab北方苍鹰算法(NGO)优化极限学习机ELM回归预测,NGO-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清…

HTTP模式下STM32程序远程升级设计

针对嵌入式终端设备架设分散、数量庞大以及应用程序更新迭代速度快带来的程序升级困难局面&#xff0c;运用STM32微控制器的在应用中编程&#xff08;IAP&#xff09;原理&#xff0c;设计了通过以太网远程升级程序的方案。 HTTP协议和LwIP协议的使用&#xff0c;不仅让整个方…

安装mmdetection2.22(windows下)

安装mmdetection2.22 确定版本安装mmcv1.4安装mmdetection测试方案1方案2 确定版本 安装mmcv1.4 首先.cuda,pytorch得安装好&#xff0c;这里我拷贝pt1.8虚拟环境 安装mmcv1.4 安装mmdetection 参考文章 下载 cd E:\Code\mmdetection\mmdetection-2.22.0 pip install -r…

机械臂笛卡尔空间轨迹规划

目录 1 引言 2 任务位置规划 2.1直线轨迹规划 2.2圆弧轨迹规划 (1)进行第一个步骤&#xff1a; (2) 进行第二步骤&#xff1a; &#xff08;3&#xff09;进行第三个步骤&#xff1a; &#xff08;4&#xff09;进行第四个步骤&#xff1a; 1 引言 随着6R机械人的使用…

设备通过ehome接入到EasyCVR后,通道数量显示不全是什么原因?

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…

【LeetCode】HOT 100(19)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

linux修改oracle sys密码

忘记了sys密码 su - oracle&#xff1b; sqlplus / as sysdba; alter user system identified by test; navicat测试连接

【软件测试三】测试用例篇

目录 1.测试用例的基本要素 2.测试用例的给我们带来的好处 3.设计测试用例的万能公式 3.1.水杯的测试用例 3.2.微信发送朋友圈的测试用例 4.设计测试用例的方法 基于需求设计的测试用例 1.等价类 2.边界值 3.判定表 4.正交法 1.正交表表达式 2.特点&#xff1a; …

【OSI体系结构】网络杂谈(14)之OSI体系结构精准理解

涉及知识点 什么是OSI体系结构&#xff0c;OSI体系结构的概念&#xff0c;网络协议三要素&#xff0c;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;表示层&#xff0c;数据链路层&#xff0c;物理层&#xff0c;开放系统互连参考模型各层的功能…

CRM系统助力医疗机构数字化营销全链路,让获客和留存更简单

在数字经济背景下&#xff0c;医疗行业面临经营、管理、组织变革升级的迫切需求。伴随云计算、大数据、物联网、5G、人工智能等数字化技术的创新应用&#xff0c;加速推动了国内医疗机构数字化转型地落地。后疫情时代下&#xff0c;如何展望未来、寻找医疗健康行业重回增长轨道…

原生DOM与组件绑定 原生DOM事件和自定义事件

1. 原生DOM可以绑定原生DOM系统事件 2. 组件标签可以绑定系统事件&#xff08;不起作用&#xff0c;因为属于自定义事件&#xff09;------ .native &#xff08;可以把自定义事件变为原生DOM事件&#xff09; 3. 原生DOM绑定自定义事件 ---无意义&#xff1a;因为没有办法触…

企业部署MES管理系统需要配置专业团队吗

随着数字化转型的推进&#xff0c;越来越多的企业开始考虑部署MES生产管理系统来提高生产效率和管理水平。在部署制造企业MES系统时&#xff0c;是否需要配置专业团队是一个关键问题。本文将探讨企业部署MES管理系统所需的专业团队的重要性&#xff0c;并提供一些建议。 全球制…

微服务进阶篇

文章目录 1、SpringCloud面试快速答法 1.1、Eureka1.2、Nacos面试快速答法 1.3、Ribbon负载小总结面试快速答法 1.4、服务雪崩小总结面试快速答法 1.5、服务监控小总结面试快速答法 2、业务相关2.1、限流Nginx限流网关限流小总结面试快速答法 2.2、分布式事务分布式理论CAP、BA…

WEB漏洞-XXEXML之利用检测绕过全解(39)

#概念 xml&#xff1a;xml被设计成传输和储存数据&#xff0c;XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素&#xff0c;其焦点是数据的内容。就类似于一种数据的格式&#xff0c;代码类的一些东西&#xff1b; xxe&#xff1a;是xml上面的一个漏洞&#xff0c;…

STM32F407 基本定时器配置输出PWM方波

介绍STM32F407定时器PWM波形输出配置方式。 通过逻辑分析采集波形数据进行可视化显示对比。 【1】定时器PWM功能介绍 STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也…

Vmware 虚拟机win7不识别usb3.0/3.1解决方案

问题现象&#xff1a; VMware安装的Win7系统&#xff0c;虚拟机设置USB控制器已打开&#xff0c;可以识别USB2.0U盘&#xff0c;不识别USB3.0/3.1U盘( 本人使用的金士顿U3.1)。 尝试方案&#xff1a; 1&#xff1a;检查本机系统Vmware USB 服务是否开启&#xff0c;重启虚拟机…