基于Spring Boot的Environment源码理解实现分散配置详解

基于Spring Boot的Environment源码理解实现分散配置详解

什么是分散配置

分散配置(Decentralized Configuration)是指将应用程序的配置从中心化的配置中心中分发到多个不同的配置文件中,并在应用程序部署时进行组合。这种方式可以提高应用程序的可维护性和灵活性。Spring Boot提供了多种实现分散配置的方式,其中Environment是一个非常重要的组件。

Environment简介

Environment是Spring Framework中非常重要的一个组件,它包含了应用程序的所有配置信息,可以访问系统属性、外部配置、命令行参数等信息。在Spring Boot中,Environment扮演了非常重要的角色,它可以帮助我们将配置分散到不同的文件中,在应用程序启动时动态地加载配置信息。

Environment属性

Environment属性包含三个主要部分:系统属性、应用程序属性和命令行属性。

系统属性

系统属性指的是Java虚拟机和操作系统相关的属性,可以通过System.getProperty()方法获取。例如:

System.getProperty("java.home");

应用程序属性

应用程序属性指的是应用程序中自定义的属性,可以通过配置文件或者编程设置。例如,在application.properties中定义如下属性:

myapp.xyz=12345

则可以通过Environment对象获取:

environment.getProperty("myapp.xyz");

命令行属性

命令行属性指的是在运行应用程序时传递给应用程序的参数,例如:

java -jar myapp.jar --server.port=8080

该命令行参数会自动解析并添加到Environment中,可以通过以下方式获取:

environment.getProperty("server.port");

Environment的实现

Environment接口有多个实现,其中以下几个是比较重要的:

  • StandardEnvironment:标准的Environment实现,用于大多数情况。
  • ConfigurableEnvironment:可配置的Environment实现,允许应用程序通过编程方式来控制属性。
  • SpringApplicationEnvironment:Spring Boot的Environment实现,由SpringApplication自动创建,用于维护应用程序的配置信息。

Environment的使用

在Spring Boot应用程序中,可以通过以下方式来使用Environment:

@Autowired
private Environment environment;

Environment有多个方法可以获取属性,其中比较常用的是getProperty()和getRequiredProperty()方法,前者获取属性值,如果不存在则返回null;后者获取属性值,如果不存在则抛出异常。

除了获取属性值,Environment还有一些其他的方法,例如getActiveProfiles()可以返回当前激活的Spring profiles,getPropertySources()可以返回Environment中所有的配置源等。

实现分散配置

实现分散配置有多种方式,这里介绍两种比较常见的方式。

配置文件分散

将应用程序的配置分散到不同的文件中,然后在应用程序启动时动态地加载配置信息。

在Spring Boot应用程序中,需要在application.properties文件中指定要加载的配置文件,例如:

spring.config.name=myapp
spring.config.location=file:/path/to/myapp.properties

该配置表示要加载myapp.properties文件,该文件需要存储在/path/to目录下。在应用程序启动时,Spring Boot会自动加载该文件,并将其中的属性合并到Environment中。

外部配置分散

将应用程序的配置存储在外部配置服务中,例如Spring Cloud Config Server或者Zookeeper,在应用程序启动时动态地加载配置信息。

在Spring Boot应用程序中,需要在bootstrap.properties文件中指定外部配置服务的地址,例如:

spring.cloud.config.uri=http://configserver:8888

在应用程序启动时,Spring Boot会自动从指定的外部配置服务中加载配置信息,并将其中的属性合并到Environment中。

示例

下面是一个示例:

配置文件分散示例

  1. 创建一个名为myapp.properties的文件,内容如下:

server.port=8080
myapp.xyz=12345

该文件存储在/home/user/conf目录下。

  1. 在application.properties文件中添加以下内容:

spring.config.name=myapp
spring.config.location=file:/home/user/conf/

  1. 在应用程序中使用Environment对象获取属性值,例如:

```
@Autowired
private Environment environment;

@GetMapping("/config")
public String getConfig() {
String port = environment.getProperty("server.port");
String xyz = environment.getProperty("myapp.xyz");

   return "port=" + port + ", xyz=" + xyz;

}
```

启动应用程序后,访问http://localhost:8080/config,可以看到输出结果为:

port=8080, xyz=12345

外部配置分散示例

  1. 创建一个名为myapp.properties的配置文件,内容如下:

server.port=8080
myapp.xyz=12345

该文件存储在Spring Cloud Config Server的Git仓库中。

  1. 在bootstrap.properties文件中添加以下内容:

spring.cloud.config.uri=http://configserver:8888

  1. 在应用程序中使用Environment对象获取属性值,例如:

```
@Autowired
private Environment environment;

@GetMapping("/config")
public String getConfig() {
String port = environment.getProperty("server.port");
String xyz = environment.getProperty("myapp.xyz");

   return "port=" + port + ", xyz=" + xyz;

}
```

启动应用程序后,访问http://localhost:8080/config,可以看到输出结果为:

port=8080, xyz=12345

以上是基于Spring Boot的Environment源码理解实现分散配置的详解,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Spring Boot的Environment源码理解实现分散配置详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java防反编译最简单的技巧分享

    这里给您详细讲解一下”Java防反编译最简单的技巧分享”的完整攻略。 标题 1. 为什么要防反编译? 在Java程序中,源代码存在于Class文件中,一旦程序发布,就有可能被反编译,导致源代码泄露,甚至是代码被篡改。为了保护源代码的安全性,就必须对Java程序进行防反编译。 2. 最简单的防反编译技巧 Java程序的防反编译技巧有很多种,比如代码混淆,加密等…

    Java 2023年5月26日
    00
  • Java 如何同时返回多个不同类型

    实现 Java 同时返回多个不同类型的方法可以有多种,以下是三种可行的方案: 方案一:利用类封装多个返回值 在 Java 中,可以使用一个类封装多个返回值。通过定义一个类(比如下面的 Result 类),该类包含多个字段,每个字段表示一个要返回的值,然后在需要返回多个值的函数中,可以将这些值封装并返回一个 Result 类的实例。以下是实现过程的示例: pu…

    Java 2023年5月26日
    00
  • 【9种】ElasticSearch分词器详解,一文get!!!| 博学谷狂野架构师

    ElasticSearch 分词器 作者: 博学谷狂野架构师 GitHub:GitHub地址 (有我精心准备的130本电子书PDF) 只分享干货、不吹水,让我们一起加油!? 概述 分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具 什么是分词器 顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。…

    Java 2023年5月8日
    00
  • Spring之ShutDown Hook死锁现象解读

    Spring之ShutDown Hook死锁现象解读 什么是ShutDown Hook死锁 在Spring应用程序正常关闭的过程中,ShutDown Hook是一个非常有用的工具。ShutDown Hook是Java进程中的一段代码块,用于在应用程序关闭时处理一些清理工作。ShutDown Hook是Spring框架中提供的一种线程,它可以在Spring应用…

    Java 2023年5月31日
    00
  • springboot @Async 注解如何实现方法异步

    SpringBoot提供了@Async注解来实现方法异步,在这个注解的加持下,这些被注解的方法将执行在单独的线程中。这可以减少应用程序的响应时间,提高应用程序的吞吐量。 下面,我们来实现一个简单的示例来说明@Async注解的使用方法。 第一步,导入必须的依赖 在pom.xml文件中,我们需要导入spring-boot-starter-web和spring-b…

    Java 2023年5月26日
    00
  • SpringSecurity导致SpringBoot跨域失效的问题解决

    首先需要明确的是,Spring Boot是默认开启CSRF保护的。而Spring Security也是默认开启CSRF保护的。当二者共存时,常常会产生CSRF保护机制引起的跨域问题。那么如何解决SpringSecurity导致SpringBoot跨域失效的问题呢?下面给出完整攻略。 1. 禁用Spring Security的CSRF保护 第一种解决方式是禁用…

    Java 2023年5月20日
    00
  • 如何创建线程?

    以下是关于如何创建线程的完整使用攻略: 如何创建线程? 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。以下是创建线程的步骤: 继承Thread类创建线程 创建一个继承自Thread类的子类,并重写run()方法。 java public class MyThread extends Thread { public void r…

    Java 2023年5月12日
    00
  • Java C++题解leetcode字符串轮转KMP算法详解

    Java C++题解leetcode字符串轮转KMP算法详解 1. 题目描述 给定两个字符串s1和s2,判断s2是否可以通过将s1中的某个子串移动后得到。 2. 思路分析 2.1 暴力枚举 我们可以将s1分为两段,任选一段放到另一段的前面,再判断是否与s2相等,如此循环往复。但是这样的时间复杂度为$O(n^2)$。 2.2 KMP算法 我们可以利用KMP算法…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部