Spring Boot 中的 Type-safe Configuration Properties:原理、用法与示例

news2024/12/29 10:48:19

Spring Boot 中的 Type-safe Configuration Properties:原理、用法与示例

前言

Spring Boot 是一个快速开发 Spring 应用程序的框架,它提供了很多有用的功能和特性。其中,Type-safe Configuration Properties 是一个常用的功能,它可以帮助开发者更方便地管理和使用配置属性。本文将介绍 Spring Boot 中 Type-safe Configuration Properties 的原理、用法和示例。

在这里插入图片描述

Type-safe Configuration Properties 的原理

在传统的 Spring 应用程序中,可以使用 @Value 注解来注入配置属性。例如:

@Service
public class UserService {

    @Value("${myapp.username}")
    private String username;

    @Value("${myapp.password}")
    private String password;

    // ...
}

这种方式存在一些问题:

  • 配置属性的命名和值都是字符串,容易出错。
  • 无法进行类型检查和自动补全。
  • 配置属性散落在代码中,不易管理和维护。

Type-safe Configuration Properties 的作用就是解决这些问题。它可以将配置属性封装成 Java 类的属性,从而实现类型检查和自动补全。具体来说,需要进行以下步骤:

  1. 创建一个 Java 类,并使用 @ConfigurationProperties 注解来标注这个类。
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private String username;

    private String password;

    // getters and setters
}
  1. 在 application.properties 或 application.yml 中配置属性。
myapp.username=admin
myapp.password=123456
  1. 在需要使用属性的地方,注入 MyAppProperties 类。
@Service
public class UserService {

    private final MyAppProperties myAppProperties;

    public UserService(MyAppProperties myAppProperties) {
        this.myAppProperties = myAppProperties;
    }

    // ...
}

这样就可以通过 myAppProperties.getUsername() 和 myAppProperties.getPassword() 来获取配置属性了。

Type-safe Configuration Properties 的用法

使用 Type-safe Configuration Properties 的步骤如下:

1. 创建配置类

首先,需要创建一个 Java 类来封装配置属性。这个类需要使用 @ConfigurationProperties 注解来标注,并且需要设置 prefix 属性来指定属性的前缀。

@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private String username;

    private String password;

    // getters and setters
}

2. 配置属性

在 application.properties 或 application.yml 文件中,需要配置属性的值。

myapp.username=admin
myapp.password=123456

3. 注入配置类

在需要使用配置属性的地方,需要注入配置类。有以下两种方式:

  • 在构造方法中注入。
@Service
public class UserService {

    private final MyAppProperties myAppProperties;

    public UserService(MyAppProperties myAppProperties) {
        this.myAppProperties = myAppProperties;
    }

    // ...
}
  • 使用 @Autowired 注解注入。
@Service
public class UserService {

    @Autowired
    private MyAppProperties myAppProperties;

    // ...
}

4. 使用配置属性

在代码中,可以通过配置类的属性来获取配置属性的值。例如:

@Service
public class UserService {

    @Autowired
    private MyAppProperties myAppProperties;

    public void login() {
        String username = myAppProperties.getUsername();
        String password = myAppProperties.getPassword();
        // ...
    }
}

Type-safe Configuration Properties 的示例

下面是一个使用 Type-safe Configuration Properties 的示例项目。

1. 创建项目

首先,使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加以下依赖:

  • Spring Web
  • Spring Data JPA
  • H2 Database

2. 创建配置类

创建一个 AppConfig 类,并使用 @ConfigurationProperties 注解来标注这个类。

@ConfigurationProperties(prefix = "app")
public class AppConfig {

    private String name;

    private String version;

    // getters and setters
}

3. 配置属性

在 application.properties 文件中配置属性的值。

app.name=My App
app.version=1.0.0

4. 注入配置类

在需要使用配置属性的地方,注入 AppConfig 类。

@Service
public class AppService {

    private final AppConfig appConfig;

    public AppService(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    // ...
}

5. 使用配置属性

在代码中使用 AppConfig 类的属性来获取配置属性的值。

@Service
public class AppService {

    private final AppConfig appConfig;

    public AppService(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    public String getAppInfo() {
        String name = appConfig.getName();
        String version = appConfig.getVersion();
        return name + " " + version;
    }
}

6. 启动应用程序

最后,启动应用程序并访问 http://localhost:8080,可以看到应用程序的名称和版本号。

@SpringBootApplication
public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

总结

Type-safe Configuration Properties 是 Spring Boot 中非常有用的一个功能,它可以帮助开发者更方便地管理和使用配置属性。本文介绍了 Type-safe Configuration Properties 的原理、用法和示例,希望可以帮助读者更好地理解和使用这个功能。

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

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

相关文章

基于STL的演讲比赛流程管理

比赛规则: 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。每名选手都有对应的编号,如10001~10012 比赛方式:分组比赛,每组6个人; 第一轮分为两个小组,整体按…

python: more Layer Architecture and its Implementation in Python and mysql 8.0

mysql 8.0 drop table DuStudentList;#学生表create table DuStudentList (StudentId INT NOT NULL AUTO_INCREMENT comment主键id, #自动增加,StudentName nvarchar(50) comment学生姓名,StudentNO varchar(50) comment学号, #学号StudentBirthday datet…

单片机学习12-串口通信

目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率(比特率) 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0 方式 1 方式 2 和方式 3 串口的使用方法 硬件设计…

基于matlab使用形态操作对视频流中的对象进行计数(附源码)

一、前言 此示例演示如何使用形态操作对视频流中的对象进行计数 输入视频流包含订书钉的图像。在此示例中,您使用平顶形态操作来消除不均匀的照明,并使用打开形态操作来消除订书钉之间的间隙。然后,将图像转换为二进制,对每个帧…

【Java】网络通信基础、协议分层及封装分用

IP地址:端口号概念格式 协议五元组协议分层TCP/IP五层模型 封装和分用 网络互连的目的是进行网络通信,也就是网络数据传输,更具体一点,是网络主机中的不同进程间基于网络来传输数据。 IP地址:端口号 概念 ip地址表示…

数据库监控与调优【十七】—— 表结构设计优化

表结构设计优化 第一范式(1NF) 字段具有原子性,即数据库的每一个字段都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项 当实体中的某个属性有多个值时,必须拆分为不同的属性 例子: 如图…

23.6.23

1.整理用户相关的指令、整理磁盘相关的指令 (1)用户相关 创建用户:sudo adduser 用户名 给新用户添加sudo权限:sudo vim /etc/sudoers 添加后wq!强制退出 删除用户:sudo userdel (-r&#x…

tomcat环境部署

目录 一、安装jdk 1、关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下,安装JDK 2、设置JDK环境变量 3、使用文本工具编写java源代码 二、安装启动Tomcat 1、解包 2、后台启动 3、使用80端口访问 一、安装jdk 在部署 Tomcat 之前必须安装好…

Java学习629

线程安全 开发中银行排号,火车售票系统中多线程程序发生的问题 引入代码: package Test0626;class SaleTicket implements Runnable{int ticket 100;Overridepublic void run() {while(true){if (ticket > 0){System.out.println(Thread.currentT…

ROS2 launch文件同时引入yaml文件参数和自定义变量参数

0 背景 在ROS中,launch工具可以帮助用户同时启动多个节点,以及引入多种设置如参数导入、节点名重映射等。在ROS1中,launch文件通过xml语言编写,后缀名为.launch;而ROS2在xml的基础上(后缀名为.xml&#xf…

【Servlet学习四】实现一个内存版本的表白墙~

目录 一、前端代码 二、后端代码实现 🌈1、全局类定义AppVar 🌈2、实体类定义Message 🌈3、获取所有信息:getMessageServlet实现前后端的交互 🌈4、添加数据:addMessageServlet,实现前后端…

notepad++去除换行符和空格

在notepad中按Ctrlh 1.去除换行符 输入如图所示的查找内容为\r\n,【替换为】不填写,勾选底部的【正则表达式】,然后点击【全部替换】 2. 按照逗号换行 输入如图所示的查找内容为,,【替换为】\r\n,勾选底部的【正则…

C# WinForm 选择打开文件和保存文件

做 winform 项目的时候正好遇到了记录一下: 打开文件 我们使用 OpenFileDialog 控件来打开文件选择框: 通过 Title 属性可以设置选择框的标题而 Filter 属性可以设置选中的文件类型,这个属性由两个部分组成 SVG files (*.svg)|*.svg &am…

九、云尚办公系统-管理端-审批管理

云尚办公系统:管理端-审批管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!…

Unity导出到AS中真机测试apk没有问题,aab提交到GooglePlay审核通过,但是从Google Play下载的应用闪退问题

从Google Play下载的应用报错如下: backtrace: #00 pc 0x0000000000050748 /data/app/~~x94h_Fmdoj4Vj1NVQcL7sQ/com.id.hhhuhi-LpC7BJqILn3X29R8TffhuA/split_config.arm64_v8a.apk!libpairipcore.so (ExecuteProgram196) 06-26 20:39:40.526 13936 13936 F l…

基于Java+Vue前后端分离宠物领养系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

ML@集成学习@摘要

文章目录 集成学习refs摘要Note准确性和多样性 集成学习方法分类BoostingAdaBoost伪代码Adaboost小结 补充补充1补充2 BaggingBagging伪代码 特点算法效率直接应用于多分类 自助采样和包外估计随机森林 Stackingsklearn中的Stacking🎈构造初级学习器构造次级学习器 …

Ubuntu18.04 系统设置修改物理内存-迅为RK3568开发板

打开虚拟机,如下图。单击红色框中的“虚拟机”。如下图所示: 然后点击“设置”弹出虚拟机的设置界面,如下图所示: 更多教程B站搜:迅为3568开发板

RHEL8.2安装QEMU及KVM虚拟化

一、环境 操作系统:CentOS8.2CPU:4C内存:16G磁盘:250G,其中180G分配给/data,用于存储数据及kvm存储池。 二、安装步骤 dnf module install virt dnf install virt-install virt-viewer virt-manager -y三…

【Redis二】Redis优化之持久化

Redis优化之持久化 1.Redis高可用2.Redis持久化2.1 RDB 持久化2.1.1 触发条件2.1.2 执行流程2.1.3 启动时加载 2.2 AOF 持久化2.2.1 开启AOF2.2.2 执行流程2.2.3 文件重写触发方式2.2.4 文件重写的流程2.2.5 启动时加载 2.3 RDB和AOF的优缺点2.4 RDB AOF持久化的区别 3.Redis性…