JavaEE【Spring】:SpringBoot 配置文件

news2024/12/23 3:47:41

文章目录

  • 一、配置文件的作用
  • 二、配置文件的格式
    • 1、注意
    • 2、说明
  • 三、properties 配置文件说明
    • 1、基本语法
    • 2、读取配置文件
      • ① 注意
    • 3、优缺点
  • 四、yml 配置文件说明
    • 1、基本语法
    • 2、yml 使用进阶
      • ① yml 配置不同数据类型及 null
        • Ⅰ. yml 配置读取
        • Ⅱ. 练习
          • a. 值为 null 的配置
          • b. 根本不存在的配置
        • Ⅲ. string 类型的引号问题
      • ② 配置对象
        • Ⅰ. 配置
        • Ⅱ. 读取
        • Ⅲ. 注意事项
          • a. 实体类中不能没有 setter 方法
          • b. 不能省略类注解
      • ③ 配置集合
        • Ⅰ. 配置
        • Ⅱ. 读取
  • 五、问题
    • 1、properties 乱码问题
      • ① 现象
      • ② 解决
    • 2、多平台环境的配置文件
      • ① 问题
      • ② 解决
  • 六、对比

一、配置文件的作用

  • 配置数据库的连接信息(root / password)
  • 项目的启动端口(端口号)
  • 第三⽅系统的调⽤秘钥等信息(身份校验)
  • 配置日志的级别

二、配置文件的格式

Spring Boot 配置⽂件主要分为以下两种格式:

  • .properties
  • .yml

如图所示:
在这里插入图片描述

1、注意

我们上一节提到过:在 Spring Boot 中是约定大于配置。那么在配置文件这块,约定就是文件名一定是 application 才行。

例如:我们将 配置文件改为 -> applications

  1. 配置文件内容就是修改端口号为 9090
server.port=9090
  1. 运行结果为:
    • 配置文件名为 application.properties:
      在这里插入图片描述
    • 配置文件名为 applications.properties:
      在这里插入图片描述

从上面的例子,我们可以看出 Spring Boot 只能识别 applications.properties/.yml 的配置文件

2、说明

举例:
在这里插入图片描述
.properties 配置如下:

server.port=9090

.yml 配置如下:

server:
  port: 9091

运行结果为:
在这里插入图片描述

上述结果说明:

  • .properties 和 .yml 可以共存,但是 .properties 配置⽂件的优先级最⾼;即如果 .properties 和
    .yml 中出现了相同的配置,会以 .properties 为主。
  • Spring Boot 在加载配置过程中,加载完.properties ⽂件之后,也会加载 .yml ⽂件的配置信息。
  • 在实际业务中,我们通常会以一直方式来配置文件,这样可以降低错误率。

三、properties 配置文件说明

1、基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,例如:

# 设置端口号
server.port=9090
# 设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

# 用户自定义配置项
mykey.key1=wzr
mykey.key2=zyf

2、读取配置文件

@Value 注解使用“${}”的格式读取,代码如下:

@RestController
public class TestController {

    @Value("${mykey.key1}")
    private String mykey;

    @RequestMapping("/hikey")
    public String HiKey(){
        return "Hi," + mykey;
    }
}

运行结果为:
在这里插入图片描述

① 注意

这里必须 使用 “${}” 的格式读取,否则就会读取失败,举例:

@RestController
public class TestController {

    @Value("mykey.key1")
    private String mykey;

    @RequestMapping("/hikey")
    public String HiKey(){
        return "Hi," + mykey;
    }
}

运行结果为:
在这里插入图片描述
这是因为,在 Spring Boot 中 约定大于配置,我们约定好 @Value 注解使用“${}”的格式读取到key 对应的 value 值,否则只会把它作为一个字符串赋值给 mykey.key1,而不是读取 mykey.key1 对应的 value 值。

3、优缺点

  • 优点:写法简单,不易出错
  • 缺点:写法不够灵活,有很多的冗余的信息,如数据库配置中同样的前缀要写很多次:
    在这里插入图片描述

这个缺点就需要 .yml 配置文件来解决了。

四、yml 配置文件说明

yml 是 YAML(Yet Another Markup Language)的缩写。

yml 的优点:

  • 可读性高,写法简单;
  • 支持更多的数据类型,还可以表示 数组、散列表、标量等数据结构;
  • 支持更多的编程语言,除去 Java,yml 还支持 Golang、Python、PHP、JavaScript等。

1、基本语法

格式:注意冒号后边有空格!!!

# 设置端口号
server:
  port: 9090
# 设置数据库的连接信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
    username: root
    password: 123456
    
# 用户自定义配置项
mykey2: wzr....

2、yml 使用进阶

① yml 配置不同数据类型及 null

Ⅰ. yml 配置读取

yml 读取和 properties 相同,代码如下:

@RestController
public class TestController {

 	@Value("${mykey2}")
    private String mykey2;

    @RequestMapping("/hikey")
    public String HiKey() {
        return "Hi," + mykey2;
    }
}

运行结果为:
在这里插入图片描述

Ⅱ. 练习

使⽤代码测试⼀下,读取值为 null 的配置和根本不存在的配置结果是否⼀致?

a. 值为 null 的配置

yml 配置文件:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
mykey3:
  nullkey: ~

测试代码:

@RestController
public class TestController {

    @Value("${mykey3.nullkey}")
    private String nullkey;

    @RequestMapping("/hikey")
    public String HiKey() {
        return "Hi," + nullkey;
    }
}

运行结果为:
在这里插入图片描述

b. 根本不存在的配置

我们只需要改一下测试接口:

@RestController
public class TestController {

	@Value("${mykey3.nokey}")
    private String nokey;

    @RequestMapping("/hikey")
    public String HiKey() {
        return "Hi," + nokey;
    }
}

运行结果为:
在这里插入图片描述
很明显报错了,这也可以看出,值为 null 与 不存在 是两回事,要注意区分。

Ⅲ. string 类型的引号问题

在 yml 中,字符串默认不加 引号,加上可表示特殊含义。

举例:
配置文件:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
mykey3:
  s1: wzr \n zyf
  s2: 'wzr \n zyf'
  s3: "wzr \n zyf"

测试代码为:

@RestController
public class TestController {

   	@Value("${mykey3.s1}")
    private String s1;

    @Value("${mykey3.s2}")
    private String s2;

    @Value("${mykey3.s3}")
    private String s3;

    @RequestMapping("/hikey")
    public String HiKey() {
        System.out.println();
        System.out.println("s1:" + s1);
        System.out.println();
        System.out.println("s2:" + s2);
        System.out.println();
        System.out.println("s3:" + s3);
        System.out.println();
        return "s1:" + s1
                + " | s2:" + s2
                + " | s3:" + s3;
    }
}

运行结果为:
在这里插入图片描述

结论:

双引号可以使得 特殊字符 发挥其作用。

② 配置对象

Ⅰ. 配置

配置对象的方式有两种:

  • 原始写法
  • 行内写法
# 原始写法
users:
  id: 1
  name: wzr
  age: 19
# 行内写法
users2: {id: 2,name: zyf, age: 19}

Ⅱ. 读取

配置:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
users:
  id: 1
  name: wzr
  age: 19

实体类:

@ConfigurationProperties(prefix = "users")
@Component
public class Users {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

@RestController
public class TestController {

    @Autowired
    private Users users;

    @RequestMapping("/hikey")
    public String HiKey() {
        return users.toString();
    }
}

运行结果为:
在这里插入图片描述

Ⅲ. 注意事项

a. 实体类中不能没有 setter 方法

从配置文件中读取的实体类,实体类中不能没有 setter 方法

举例:
在实体类中,注释掉一个 setter 方法。

@Component
@ConfigurationProperties(prefix = "users")
public class Users {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

//    public void setAge(int age) {
//        this.age = age;
//    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果为:
在这里插入图片描述

这是因为这里的 @ConfigurationProperties 注解是通过 setter 将配置文件中的内容赋值的。

b. 不能省略类注解

@ConfigurationProperties 注解需要搭配类注解使用。

举例:
在实体类中,注释掉类注解

package com.example.springbootdemo.model;

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

//@Component
@ConfigurationProperties(prefix = "users")
public class Users {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果为:
在这里插入图片描述

这里是因为,在 Spring 中,我们需要先将 Bean 注入,否则无法启动项目。

③ 配置集合

Ⅰ. 配置

配置对象的方式有两种:

  • 原始写法
  • 行内写法
# 原始写法
myList:
  name:
    - wzr
    - zyf
# 行内写法
myList2: {name: [wzr,zyf]}

Ⅱ. 读取

配置:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
myList:
  name:
    - wzr
    - zyf

实体类:这里的 @Data 注解就为我们提供了 getter 和 setter 方法

@Component
@ConfigurationProperties(prefix = "mylist")
@Data
public class MyList {
    private List name;
}

测试类:

@RestController
public class TestController {

    @Autowired
    private MyList myList;

    @RequestMapping("/hikey")
    public String HiKey() {
        return myList.getName().toString();
    }
}

运行结果为:
在这里插入图片描述

五、问题

1、properties 乱码问题

① 现象

在这里插入图片描述

② 解决

原因:配置文件不支持中文
在这里插入图片描述
解决方法:File -> settings
在这里插入图片描述

2、多平台环境的配置文件

① 问题

在日后的工作中,我们可能对于一个项目需要经过 测试,开发,生产 等等多种环境,这些环境的某些配置可能不相同,但是我们又不想每次更换环境的时候重写配置文件,那怎么办呢?

② 解决

通过 spring.profiles.active 来选择环境配置,我们将不同环境配置写好,然后在使用时只需要选择环境即可。
在这里插入图片描述

六、对比

  • properties
    1. properties 是以 key=value 的形式配置的键值类型的配置⽂件
    2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据
  • yml
    1. yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置文件
    2. 使⽤ yml 可以很好的解决数据冗余的问题
    3. yml 通⽤性更好,⽀持更多语⾔
  • 两者虽然能共存,但建议只使用一种

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

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

相关文章

利用云服务器发布项目

前言 平时开发我会写一些小demo,我自己觉得有用的会集中起来形成一个项目,本来想利用gitee的gitee page直接部署出来,但后面了解了下,它只支持官网之类的静态页面,无法与后台数据交互,想要完整的服务还是得…

数据分析业务场景 | 用户画像

一.概况 定义 是根据用户的一系列行为和意识过程建立起来的多维度标签;是根据用户人口学特征,网络浏览内容,网络社交活动和消费行为等信息而抽象出的一个标签化的用户模型;首要任务:根据业务需求整理和数据情况分析建…

Springboot redirect重定向使用RedirecAtrributes传递数据

参考资料 【转载】关于重定向RedirectAttributes的用法RedirectAttributes 的使用 目录前期准备一. RedirecAtrributes重定向传参三. 重定向目标页面接收参数前期准备 ⏹配置文件 server:servlet:context-path: /jmw⏹访问url http://localhost:8080/jmw/test16/init?name…

NX二次开发(C#)-UI Styler-选择对象TaggedObject转换为Body、Face等对象

文章目录 1、前言2、选择对象的过滤器2、选择对象类型为TaggedObject3、TaggedObject转换为Face类型1、前言 前面的博客中已经写过了UI Styler中选择对象(selection)的一些内容,但是依然有读者不知道运用,本文将在前文的基础上更加深入的介绍选择对象的应用(建议与https:/…

DevExpress Universal添加对.NET 7的支持

DevExpress Universal添加对.NET 7的支持 DevExpress已经发布了整个产品系列的主要更新。 CodeRush Ultimate 22.2-为许多重构添加了核心性能优化和增强。 DevExpress.NET MAUI 22.2-添加了对Material Design 3指南的支持,以及对数据网格的自定义过滤、排序和分组。…

PCB封装

目录 1.PCB元器件库分类及命名 1.2PCB封装图形要求 2.封装制作 手工制作封装的操作步骤 1.PCB元器件库分类及命名 元器件采用大写字母表示,PCB元器件库分类及命名如表。 2.PCB封装图形要求 (1)外形:指元器件的最大外形尺寸。封…

【微电网优化】基于粒子群实现微网经济调度,环境友好调度附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Java 中的不同参数类型

是不是还傻傻分不清参数配置到底怎么写,写在哪个位置,那么这篇文章就让你学会。 目录 1、Program arguments 2、VM options 3、Environment variables 最佳实践 打开 IDEA 的 Run Configuration,可以看到以下参数配置 VM optionsProgram…

springboot+vue美食网站idea maven

目 录 摘 要 I 1 绪论 1 1.1研究背景 1 1. 2研究现状 1 1. 3研究内容 2 2 系统关键技术 3 2.1 springboot框架 3 2.2 JAVA技术 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1. 2经济可行…

12.11哈希表

目录 一.哈希表 1.概念 2 冲突-概念 3 冲突-避免 4 冲突-避免-哈希函数设计 直接定制法--(常用) 2. 除留余数法--(常用) 3. 平方取中法--(了解) 4. 折叠法--(了解) 5. 随机数法--(了解) 6. 数学分析法--(了解) 5 冲突-避免-负载因子调节(重点掌握&#…

151-160-mysql-高级篇-设计规范及其他调优策略

151-mysql-高级篇-设计规范以及其他调优策略: 1、数据库的设计规范 1. 范 式 1.1 范式简介 **在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。**可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一…

iOS 组件二进制与源码查看及调试方案

好久没有写文章了这里记录一下把项目代码二进制化提高编译效率的整个过程中碰到的问题和解决方案 先提一下优化编译速度的基本方向基本就是从不同的编译阶段来出主意,比如: 预编译阶段的头文件查找: 一款可以让大型iOS工程编译速度提升50%的…

[附源码]Node.js计算机毕业设计大学生心理咨询系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

无法安装vmnet8虚拟网络适配器、vmware network editor未响应、注册失败,请检查账号数据库配置是否正确的解决

文章目录虚拟网络适配器安装 | vmware network editor未响应注册失败,请检查账号数据库配置是否正确的解决关于第一次安装虚拟机的全文约 423 字,预计阅读时长: 2分钟虚拟网络适配器安装 | vmware network editor未响应 原因:卸载…

JDK8 ThreadLocal 源码解析与最佳实践

文章目录用法Example1Example2Springboot Transcation 注解的原理Entry 的 Key 设置为弱引用有什么好处内存泄漏问题为什么 ThreadLocal 不需要 ReferenceQueueget()getEntrygetEntryAfterMissThis class provides thread-local variables. These variables differ from their …

路径规划|多目标海洋捕食者算法(MOMPA)求解最短路径问题(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1 LabVIEW面向对象编程(OOP)采用仪器为中心的硬件抽象层(HAL),使用面向对象的设计模式,可以部署一个仪器重用库,该库可以随着需求和仪器趋势的变化而增长,同时在不可避免的硬件过…

【Redis】主从复制

一、简介 1、什么是主从复制 主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Matser以写为主,Slave以读为主,简单来说如下图 2、主从复制的好处 读写分离:Matser以写为主,Slave以读为主…

指针的初步认识

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、指针是什么1.1 如何理解编址…

《深入分布式缓存-从原理到实践》笔记

《深入分布式缓存-从原理到实践》笔记 笔记作者:arthury.dy.lee 日期:2018.12.05 笔记只是本人觉得重要的部分的一些摘要或总结,更侧重于后5章。其它更详细内容,请自行买书阅读。 文章目录《深入分布式缓存-从原理到实践》笔记…