SpringBoot扩展外部化配置的原理解析

yizhihongxing

下面我为你详细讲解“SpringBoot扩展外部化配置的原理解析”的攻略。

1. 理解SpringBoot配置管理流程

SpringBoot使用YAMLproperties格式的文件来管理应用程序所需的各种配置信息。它们可以分为应用表现配置和逻辑配置两类,其中应用表现配置是指一些与应用程序用户直接交互的配置,例如网站标题和页脚等。逻辑配置是指一些与应用程序内部运行相关的配置,例如数据库连接、日志级别、缓存配置等。

1.1常规配置方式

常规的SpringBoot项目通常使用application.ymlapplication.properties文件来管理配置信息,在应用启动时,SpringBoot会读取这些文件中的配置信息并加载到系统属性或环境变量中。例如,如果我们在application.yml文件中配置了一个名为name的属性:

name: My Application

在应用程序中可以通过以下方式获取这个配置值:

@Value("${name}")
private String appName;

1.2 扩展外部化配置

对于大型的项目而言,配置信息的数量和复杂度可能会非常高,常规的配置方式会显得过于简单。SpringBoot提供了扩展外部化配置的能力。所谓扩展外部化配置,就是指SpringBoot可以通过自定义配置加载器来加载非常量的配置信息,并提供访问这些配置信息的方法。这种方式可以通过多种方式实现,包括将配置信息放在外部文件、使用数据库存储配置信息、使用云配置服务等。

2. 示例说明

以下示例仅用于说明如何实现扩展外部化配置,具体实现方式可能有所不同。

示例一:使用外部文件存储配置信息

在这个示例中,我们将使用一个demo.properties文件作为外部配置文件,并在应用程序中访问这个配置信息。

  1. 创建demo.properties文件,并将其放在classpath根目录下。

properties
demo.config.key1=value1
demo.config.key2=value2

  1. 添加依赖

xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

  1. 创建一个类,用来读取这些配置信息。这个类需要使用@ConfigurationProperties注解来指定这个配置的前缀。

```java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "demo.config")
public class DemoConfiguration {

   private String key1;

   private String key2;

   public String getKey1() {
       return key1;
   }

   public void setKey1(String key1) {
       this.key1 = key1;
   }

   public String getKey2() {
       return key2;
   }

   public void setKey2(String key2) {
       this.key2 = key2;
   }

}
```

  1. 在应用程序中使用这些配置信息:

```java
@Autowired
private DemoConfiguration demoConfiguration;

logger.info(demoConfiguration.getKey1());
logger.info(demoConfiguration.getKey2());
```

示例二:使用数据库存储配置信息

这个示例中,我们将使用MySql数据库存储配置信息。

  1. 添加依赖

xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

  1. 创建MySql数据库,并创建一个table用于存储配置信息。

sql
CREATE TABLE `config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`value` varchar(1024) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

  1. 创建一个实体类,用于映射config表。

```java
import javax.persistence.*;

@Entity
@Table(name = "config")
public class Config {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String name;

   private String value;

   public Long getId() {
       return id;
   }

   public void setId(Long id) {
       this.id = id;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getValue() {
       return value;
   }

   public void setValue(String value) {
       this.value = value;
   }

}
```

  1. 添加一个ConfigRepository接口,用于查询配置项。

```java
public interface ConfigRepository extends CrudRepository {

   Config findByName(String name);

}
```

  1. 创建一个DatabaseConfigLoader类,用于加载配置信息。

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class DatabaseConfigLoader {

   private final ConfigRepository configRepository;

   @Autowired
   public DatabaseConfigLoader(ConfigRepository configRepository) {
       this.configRepository = configRepository;
   }

   @PostConstruct
   public void loadConfigurations() {
       Iterable<Config> configs = configRepository.findAll();
       configs.forEach(config -> System.setProperty(config.getName(), config.getValue()));
   }

}
```

  1. 在应用程序中使用这些配置信息。

```java
@Value("${name}")
private String appName;

logger.info(appName);
```

这就是两个示例,通过这两个示例,你可以初步了解如何实现SpringBoot应用程序的扩展外部化配置功能。其中,示例一中使用了外部文件来存储配置信息,示例二中则使用了MySql数据库来存储配置信息。两个示例所演示的方法都是比较常见的,当然,实现方式还有很多,具体如何实现要根据自身需求来定。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot扩展外部化配置的原理解析 - Python技术站

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

相关文章

  • 一文搞懂MyBatis多数据源Starter实现

    一文搞懂MyBatis多数据源Starter实现 多数据源在一些应用场景下非常常见,MyBatis也提供了多数据源的支持。但是对于开发者来说,要手动实现多数据源的切换非常繁琐,而且容易出错。MyBatis多数据源Starter可以帮助我们自动配置多数据源并提供切换功能。本文将对MyBatis多数据源Starter的使用进行详细讲解。 步骤一:添加依赖 首先,…

    Java 2023年5月20日
    00
  • 一篇文章弄懂JVM类加载机制过程以及原理

    那么让我们来详细讲解一下“一篇文章弄懂JVM类加载机制过程以及原理”的完整攻略。 1. JVM类加载机制基础 在深入了解JVM类加载机制的过程之前,我们需要先了解一些相关的基础知识。 1.1 类、类加载器和类加载 在Java中,我们通常所说的类是指Java类,而Java类的定义是以.java文件为载体,通过编译器(如javac)将其转换为.class文件后生…

    Java 2023年5月26日
    00
  • Java String保存字符串的机制

    Java使用String类来保存字符串,String类在Java中被广泛使用。在Java中,字符串是不可变的(immutable)对象,这意味着一旦字符串对象被创建,就不能修改其值。String类用来表示字符串,它保存在常量池(constant pool)中,常量池是Java虚拟机中的一个系统级的内存池,它用来保存器内部需要用到的各种常量,包括字符串常量。 …

    Java 2023年5月20日
    00
  • Java实现顺序表的操作详解

    Java实现顺序表的操作详解 顺序表又称为动态数组,是一种顺序存储的线性结构。在一个一维数组的物理空间中依次存放线性表的各个元素,通常使用分配一段连续的存储空间来存储。本文将详细讲解Java实现顺序表的操作,包括构建、插入、删除、查找等。 初始化顺序表 在Java中,我们使用数组来存储顺序表,因此初始化顺序表即为创建一个数组并分配相应的存储空间。在这里我们先…

    Java 2023年5月26日
    00
  • 一文掌握SpringSecurity BCrypt密码加密和解密

    一文掌握SpringSecurity BCrypt密码加密和解密 什么是SpringSecurity BCrypt密码加密 SpringSecurity BCrypt密码加密是一种基于BCrypt算法的加密方式。BCrypt算法是一种单向加密算法,它可以用于密码的加密和解密,但解密过程需要很长的时间,通常需要数十年或者更长的时间才能破解。因此,BCrypt算…

    Java 2023年5月20日
    00
  • JAVA中正则表达式匹配,替换,查找,切割的方法

    在Java中,可以使用正则表达式进行字符串匹配,替换,查找和切割等操作。使用正则表达式需要使用Java.util.regex包中的类。 正则表达式基本语法 正则表达式是一种特殊的字符串,可以用于描述匹配一个字符串的规则。正则表达式的基本语法如下: 1. 字符串 表示要匹配的字符串,例如 abc。 2. 字符集 表示可以匹配的字符集合,例如 [abc] 表示可…

    Java 2023年5月27日
    00
  • Java与WebUploader相结合实现文件上传功能(实例代码)

    下面我来为您详细讲解Java与WebUploader相结合实现文件上传功能的完整攻略。 1. 简介 WebUploader是一款基于HTML5的文件上传组件,它提供了文件分块上传、图片预览、拖拽上传等功能,更重要的是,它是兼容各种浏览器的。在Web应用程序中使用WebUploader可以方便地实现文件上传功能。 Java是一种跨平台的编程语言,也是应用最广泛…

    Java 2023年6月15日
    00
  • Java中的ClassNotFoundException是什么?

    ClassNotFoundException是Java中的一种异常类型,表示虚拟机在试图加载类时无法找到指定的类。 当Java虚拟机无法找到某个类时,会抛出ClassNotFoundException异常。通常情况下,这种情况发生在以下几种情形中: 使用Class.forName()方法加载类时,指定的类不存在; 使用ClassLoader.loadClas…

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