基于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日

相关文章

  • springboot各种下载文件的方式汇总

    Spring Boot各种下载文件的方式汇总攻略 在Web应用程序中,下载文件是常见的功能之一。Spring Boot提供了多种方式来下载文件。本文将汇总介绍Spring Boot中各种下载文件的方式。 1. 使用OutputStream下载文件 最简单的方式是使用OutputStream将文件写入到HttpServletResponse的输出流,并将相应的…

    Java 2023年5月19日
    00
  • Java Agent探针技术详解示例

    Java Agent指的是一种能够以独立的模块形态运行的Java程序,它可以在应用程序运行期间在代码层面上监测应用程序的运行情况,记录应用程序运行过程中的各种参数和信息,这些信息对于分析系统性能、查找故障等都有着非常重要的意义。本文将从以下两个方面详细讲解Java Agent探针技术的应用。 Java Agent探针技术的基本原理 Java Agent探针技…

    Java 2023年5月26日
    00
  • Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    针对“Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍”的话题,以下是完整攻略的介绍: 一、概述 OpenSSL是一个开源的安全套接字层(SSL)实现库,能够实现多种安全协议,包括SSL和TLS。Java OpenSSL是使用Java编写的,利用OpenSSL库生成RSA公私钥,以及使用公私钥进行数据的加解密。 本文将详细介绍Java Ope…

    Java 2023年5月19日
    00
  • Java8 新特性之日期时间对象及一些其他特性

    Java8 新特性之日期时间对象及一些其他特性 为什么需要新的日期时间API? 在Java 7之前,我们使用的日期时间API(java.util.Date和java.util.Calendar)存在几个问题: 非线程安全:在多线程环境下,如果多个线程同时操作日期时间对象,容易出现错误。 可变类型:java.util.Date和java.util.Calend…

    Java 2023年5月20日
    00
  • Spring Boot Security配置教程

    下面我将详细讲解如何配置Spring Boot项目的Spring Security。首先,我们需要按照以下步骤进行配置: 步骤一:pom.xml文件中添加依赖 首先,我们需要在pom.xml文件中添加Spring Security的依赖。示例代码如下: <dependency> <groupId>org.springframework…

    Java 2023年5月15日
    00
  • MyBatis Generator的简单使用方法示例

    MyBatis Generator 的简单使用方法示例 什么是 MyBatis Generator MyBatis Generator 是一个基于 Java 的代码生成器,可以快速为 MyBatis 创建数据访问层代码。使用 MyBatis Generator 可以自动生成 MyBatis 的 POJO 类、Mapper 接口和 SQL 映射文件。 MyBa…

    Java 2023年5月20日
    00
  • Spring Boot Thymeleaf实现国际化的方法详解

    在Spring Boot应用程序中,我们可以使用Thymeleaf模板引擎来实现国际化。Thymeleaf提供了一种简单而有效的方式来处理多语言文本,它可以根据用户的语言环境自动选择正确的文本。在本文中,我们将详细讲解Spring Boot Thymeleaf实现国际化的方法。 配置文件 在Spring Boot应用程序中,我们可以使用配置文件来定义多语言文…

    Java 2023年5月18日
    00
  • 利用Springboot+vue实现图片上传至数据库并显示的全过程

    下面是利用Spring Boot和Vue实现图片上传至数据库并显示的全过程。 前置准备 技术栈 Spring Boot Vue.js axios ElementUI MySQL MyBatis 下载代码 可以从GitHub上下载示例代码:https://github.com/KevinPang2019/springboot-vue-image-upload …

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