JavaEE10-Spring Boot配置文件

news2025/1/11 14:08:23

目录

1.配置文件作用

2.配置文件的格式

为配置文件安装提示插件

2.1. .properties(旧版,默认的)

2.1.1.基本语法

PS:配置文件中使用"#"来添加注释信息,2种添加方式:

2.1.2.缺点分析

2.2. .yml(新版)

2.2.1.基本语法

2.2.2.使用进阶

①配置不同数据类型及null

②配置对象

@ConfigurationProperties来读取配置中的对象:

③配置集合

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的。

2.3.properties VS yml

2.4.查看更多系统配置项

3.读取配置文件

3.1.读取properties配置文件:

3.2.读取yml配置文件:

PS:注意:value值加单双引号(yml)

4.扩展:Spring Boot读取配置文件的5种方法

4.1.@Value注解(仅限单个信息,集合和对象除外)

4.2.@ConfigurationProperties注解

4.3.Environment(Spring提供的对象,注入后就能用)

4.4.@PropertySource注解

中文乱码

4.5.原生方式读取(不推荐麻烦)


1.配置文件作用

整个项目中所有重要的数据(会随环境变更的配置信息)都是在配置文件中配置的,如:

  • 数据库的连接信息(包含用户名和密码的设置)。
  • 项目的启动端口。
  • 第三方系统的调用密钥等信息。
  • 用于发现定位问题的普通日志和异常日志等。

配置文件中存储的内容有2种:①系统级别的信息;②程序员自定义的信息(特殊业务如保存第三方密钥)。

如果没有配置信息,那么Spring Boot项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志,所以配置信息的作用是非常重要的。

如果没有配置文件,配置信息若写死在源代码中,会存在的问题:

  1. 配置项可能写在多个源代码的文件中,会有遗漏的风险。而配置文件让所有的配置信息都统一写在一起,无论查看还是修改都一目了然。

  2. 文件保存地址:本地(大概率是Windows系统)和生产服务器(99.9%为Linux系统)二者的目录就完全不一样。MySQL连接的配置文件,本地和远程是不一样的。

    Spring Boot一个项目里可以设置2套以上的环境,如:

    有一个配置文件专门写在开发环境,还为生产环境再去建一个配置文件。

    (这样就不用像之前:上线时配置文件要改为生产环境的配置文件,本地运行时又改为开发环境的配置文件)

    只需在进行环境变更的时候,指定一下Spring Boot要用哪个环境的配置文件就行。

    (两个文件不存在把哪个注释掉,不用像之前一样添加注释改来改去)

  3. 若把所有的配置信息写死在源代码中,是不可改的;而写在配置文件中,是可改的。

    .java源代码(可改)编译后生成的target文件夹里是.class字节码文件(改不了);

    而配置文件(可改)编译后生成的target文件夹里还是配置文件(可改)。

    项目最后运行格式是jar包的格式,jar包里放的是target里的文件,配置文件可以直接从jar包中拉出来,做完修改后再放回压缩包里覆盖原先内容,利于修改。

  4. 若是在源代码中写的内容,只能由程序员来进行修改;而配置文件中的内容不仅程序员可改,运维工程师(可改配置文件,懂Linux指令,攻防安全的手段,不会改java源代码)也可修改。在项目上线时,运维决定把服务放在哪台机器上,决定连哪个数据库,他就需要能直接去改配置文件。

2.配置文件的格式

Spring Boot配置文件主要分为以下2种格式(文件的后缀代表文件的格式,配置文件也是如此):

  • properties类型的配置文件属于老版本一代产品,也是创建Spring Boot项目时默认的文件格式;而yml属于新版二代产品,若程序员会用且要用,直接创建即可。
  • 配置文件的名称是固定的认死的,只能是"application",如果改成其它的名称,配置文件的内容将不再生效。(约定大于配置)
  • 配置文件里尽量不要出现中文,会有乱码。yml中可以用中文,因为创建时默认文件格式是UTF-8;properties中千万不要用中文,第二次打开会出现中文变乱码情况,因为创建时文件格式默认是GBK(在未进行系统配置之前)。解决:File里进行重新配置 -> New Project Settings -> Settings for new project -> 搜File Encodings -> 全改为UTF-8(3处)【原来的改不回来,下一次的才会起作用】
  • 理论上讲,项目中二者可以并存,当二者并存于一个项目中时,如果2个配置文件中出现了同样的配置,则会以properties中的配置为主,也就是.properties配置文件的优先级最高,但加载完.properties配置文件之后,也会加载.yml文件的配置信息。(约定大于配置
  • 实际业务中,不会混用,会采用一种统一的配置文件格式,这样可以更好地维护(降低故障率)。

为配置文件安装提示插件

IDEA社区版安装Spring Assistant插件之后,就可以正常创建Spring Boot项目了,并且支持yml配置文件的代码提示,但默认不支持properties配置文件的代码提示。(专业版当然天然支持)

此时需要安装Spring Tools插件并重启才会有相应提示。

部分版本IDEA可能没有,尝试使用在线安装地址:Spring Tools在线安装地址https://plugins.jetbrains.com/plugin/14279-spring-tools

也有可能与自己电脑上的IDEA适配不了。

若实在安装不了,就直接用yml吧~

2.1. .properties(旧版,默认的)

2.1.1.基本语法

properties是以键值的形式配置的,key和value之间是以"="连接的。

注:"="的前后不需要加空格,末尾不需要加分号,空格。加多余的任何东西都会报错!

key1=value1
key2=value2
...

PS:配置文件中使用"#"来添加注释信息,2种添加方式:

①选中要添加注释的内容 ctrl + "/";

②在要添加注释的内容前面直接 + "#"。

①系统级别的信息

# 配置项⽬端⼝号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

②程序员自定义的信息(key可以为任意内容,只要不是中文就行)

myconfig.sayhi=hello,config.

2.1.2.缺点分析

配置key有很多冗余信息,也看不出层级关系。要解决此问题,需要用到yml配置文件的格式化。

2.2. .yml(新版)

  • yml是YAML的缩写。(Yet Another Markup Language另一种标记语言)
  • yml是一个语法简单,可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言(json)类似,并且支持更多的数据类型,可以简单表达清单(数组),对象,散列表,标量等数据形态。不再使用value(只能读取单个的基本数据类型的值)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构,各种配置文件等。
  • yml最大的优势是可以跨语言,通用性高,不止是Java中可以使用,golong,高版本的python都可以使用yml作为配置文件。有利于大型企业不同地区(使用语言可能不同)团队合作时程序的互通互联。如果是云服务器开发,可以使用⼀份配置文件作为 Java 和 Go 的共同配置文件。

golong是非常火的谷歌的语言(谷歌目的是创建一种在性能上打败C++,但比C++好用很多的语言),以性能著称,今日头条用的多。

线程是轻量级的进程,Java里并发编程使用的都是多线程;

协程是轻量级的线程,它支持的某些特性是比Java还要灵活些的。golong里有协程,Java里没有。

2.2.1.基本语法

yml是树形结构的配置文件,它的基础语法是"key: value"。

注:key和value之间使用英文冒号加空格的方式组成,其中的空格不可省略

简单的多级目录写法:

前面有一个tab表示一级目录,没有tab:一级目录;有1个tab:二级目录;有2个tab:三级目录。

key1:  #一级
  key2:  #二级
    key3: value2 #三级
    key4: value3 #三级

连接数据库配置:(解决了properties的冗余问题)

# 连接数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
    username: root
    password: 12345678
    driver-class-name: com.mysql.driver

2.2.2.使用进阶

①配置不同数据类型及null

# 字符串
string.value: Hello

# 布尔值
boolean.value: true
boolean.value1: false

# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制

# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法

# Null,~代表null
null.value: ~

②配置对象

多行写法:(一个标准对象表达式)

student: # 一级目录是对象的名称
  id: 1 # 二级目录是这个对象的所有属性
  name: Java # 二级目录是这个对象的所有属性
  age: 18 # 二级目录是这个对象的所有属性

行内写法:(更像json的数据格式)(与上面的写法作用一致) (数据比较多时推荐使用)

student: { id: 1,name: Java,age: 18 }

此时就不能用@Value(读取非对象,集合)来读取配置中的对象了,而要用另一个注解:

@ConfigurationProperties来读取配置中的对象

@ConfigurationProperties(prefix = "对象的名称") 

其中的 "prefix = " 可以省略。

多行写法和行内写法读取一样。

student: # 一级目录是对象
  id: 1 # 二级目录是这个对象的所有属性
  name: Java # 二级目录是这个对象的所有属性
  age: 18 # 二级目录是这个对象的所有属性
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data //因为加lombok,所以加上@Data注解就会有get,set方法
@ConfigurationProperties(prefix = "student") //设置key值
@Component //必须要加5大类注解
public class Student {
    private int id;
    private String name;
    private int age;
}
import com.example.demo.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Autowired //注入
    private Student student;

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        System.out.println(student);
        return "日志详见控制台";
    }
}

③配置集合

配置文件也可以配置list集合。

多行写法:

dbtypes:  # 集合的名称
  name:  # 属性
    - mysql # 属性的值
    - sqlserver # 属性的值
    - db2 # 属性的值

行内写法:(与上面的写法作用一致)(数据比较多时推荐使用)

dbtypes: { name: [ mysql,sqlserver,db2 ] }

集合的读取和对象一样,也是使 @ConfigurationProperties 来读取的。

@ConfigurationProperties("集合的名称")
dbtypes: { name: [ mysql,sqlserver,db2 ] }
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@Data
@ConfigurationProperties("dbtypes") //读取dbtypes集合赋值到DBTypes类里的name属性
public class DBTypes { 
    private List<String> name; //此处的属性名要和所读取的集合的属性名保持一致
}
import com.example.demo.model.DBTypes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Autowired
    private DBTypes dbTypes;

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        return "dbtypes:" + dbTypes;
    }
}

2.3.properties VS yml

properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。
properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。 

2.4.查看更多系统配置项

想要查看Spring Boot更多系统配置项,访问官网:Spring Boot更多系统配置项https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

3.读取配置文件

在项目中若要主动读取配置文件中的内容,可以使用@Value(仅限单个信息,集合和对象除外)注解来实现。

@Value注解使用"${}"的格式读取。

@Value("${server.port}")

无论是properties还是yml,中间都用"."连接其上下级。(它们的读取系统和自定义配置文件写法一样)

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Value("${server.port}") //表示动态拿一个参数server.port
    private Integer port; //并把它赋值给port

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        return "config:" + port;
    }
}

3.1.读取properties配置文件:

①读取系统配置信息:

②读取自定义配置信息:

3.2.读取yml配置文件:

PS:注意:value值加单双引号(yml)

字符串默认不用加上单引号或双引号,如果加英文的单双引号可以表示特殊含义。

在没有特殊字符时:啥都不加,加单引号,加双引号 -> 效果一样。

在有特殊字符时,如"\n":

# 字符串的定义方法
mystr1: 你好1\n你好1
mystr2: '你好2\n你好2'
mystr3: "你好3\n你好3"
mystr4: "你好4\\n你好4"
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ReadYml {
    @Value("${mystr1}")
    private String str1;

    @Value("${mystr2}")
    private String str2;

    @Value("${mystr3}")
    private String str3;

    @Value("${mystr4}")
    private String str4;

    @PostConstruct
    public void postConstruct() {
        System.out.println("mystr1:" + str1);
        System.out.println("mystr2:" + str2);
        System.out.println("mystr3:" + str3);
        System.out.println("mystr4:" + str4);
    }
}

@Component在Spring Boot启动时会注入到框架中,注入到框架中时会执行@PostConstruct初始化方法,此时就能读取到配置信息了。

啥都不加:会将字符串中的特殊字符转义,比如将"\n"转换成"\\n"。

加单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。(和啥都不加情况一样)

加双引号:不会转义字符串里的特殊字符,特殊字符会作为本身想表示的意思。"\n"就是换行;若是"\\n",才会将换行符转义为普通字符串。

:js/yml中单引号中可以是字符串;而java中单引号中是字符(char),双引号中才是字符串(string)。

4.扩展:Spring Boot读取配置文件的5种方法

4.1.@Value注解(仅限单个信息,集合和对象除外)

4.2.@ConfigurationProperties注解

4.3.Environment(Spring提供的对象,注入后就能用)

4.4.@PropertySource注解

中文乱码

如果配置文件中出现中文乱码的情况,可通过指定编码格式的方式来解决中文乱码问题。

@PropertySource(value = "dev.properties", encoding = "utf-8")
//value表示要读取的配置文件的名字
//encoding表示指定编码格式

注:@PropertySource注解默认是支持properties格式配置文件的读取的。

4.5.原生方式读取(不推荐麻烦)

前2种,可以解决读取配置配置文件的 90% 的问题。
其余三种,知道其存在即可。

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

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

相关文章

阿里“云开发“小程序(uniCloud)

博主ps&#xff1a; 网上资料少的可怜&#xff0c;哎&#xff0c;腾讯云涨价了&#xff0c;论服务器&#xff0c;我肯定选的阿里&#xff0c;再着你们对比下uniCloud的报价就知道了&#xff0c;如果有钱就另当别论了。 所以这片博文&#xff0c;博主试过之后&#xff0c;先抛出…

Git速成指南

文章目录版本管理工具概念版本管理工具介绍版本管理发展简史SVN(SubVersion)GitGit工作流程图Git安装基本配置为常用指令配置别名&#xff08;可选&#xff09;解决GitBash乱码问题Git常用命令获取本地仓库基础操作指令查看修改的状态&#xff08;status&#xff09;添加工作区…

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进从以开始就一直在尝试对WAL进行不同级别的压缩。自2016年以来内置功能&#xff08;wal_compression&#xff09;就一直存在&#xff0c;几乎所有备份工具都会在传递到备机前对WAL进行压缩。但现在是时候再看看内置的wal_compress…

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

在正式学习本篇博客前&#xff0c;先要了解一下什么是 SVG&#xff08;Scalable Vector Graphics&#xff09;&#xff0c;它是一种矢量图形格式&#xff0c;可以用来在网页上创建可伸缩的图形。 使用 SVG 技术实现反爬虫的方法有以下几种&#xff1a; 验证码&#xff1a;使用…

imx6ull Linux使用设备树配置LED

我们基于寄存器的方式已经编写了LED驱动&#xff0c;实现点亮/熄灭LED&#xff0c;但是你有没有发现一个问题&#xff0c;就是假设LED修改了一个GPIO&#xff0c;那么需要对应的修改寄存器代码&#xff0c;非常繁琐&#xff0c;而且随着改板次数增加&#xff0c;那么会带来一个…

从零开始的数模(五)插值与拟合

目录 一、概念 二、 插值 2.1方法 2.2MATLAB实现 例题1 ​编辑例题2 2.3python实现 2.3.1例题一的python解法 2.3.2二维网格节点插值 例题四 三、拟合篇&#xff1a; 3.1MATLAB实现 3.2python实现 一、概念 二、 插值 2.1方法 2.2MATLAB实现 在MATLAB中提供了一些…

带滤波器的PID控制仿真-2(M语言)

被控对象为三阶传递函数&#xff1a;低通滤波器为&#xff1a;采样时间为1ms&#xff0c;噪声信号加在对象的输出端。分三种情况进行:M1 时&#xff0c;为未加噪声信号;M2时&#xff0c;为加噪声信号未加滤波;M3时&#xff0c;为加噪声信号加滤波。阶跃响应结果如图1&#xff5…

【论文精读】KD-MVS

今天读的是发表在ECCV2022上的自监督MVS文章&#xff0c;作者来自于旷视科技和清华大学。 文章链接&#xff1a;arxiv 代码链接&#xff1a;https://github.com/megvii-research/KD-MVS 目录Abstract1. Introduction2. Related work3. Methodology3.1 Self-supervised Teacher …

51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)

51单片机七人多数表决器仿真设计( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0033 51单片机七人多数表决器仿真设计视频讲解1.主要功能&#xff1a;2.仿真3.…

Java:Mybatis的使用

一、Mybatis的概述 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。 MyBatis中文官网&#xff1a;https://mybatis.org/mybatis-3/zh/getting-started.html 二、Mybatis快速入门 1、创建user表&#xff0c;添加数据 create database mybatis; use mybati…

英语语法大全

文章目录一、主语1、名词、代词和动词做主语2、主语从句做主语&#xff0c;谓语动词用单数3、主语从句练习二、谓语动词1、谓语动词种类2、主谓一致三、宾语1、单宾语2、双宾语3、复合宾语4、宾语从句四、定语1、定语从句2、定语从句的翻译五、状语1、分词做状语2、独立主格结构…

42.Isaac教程--超像素

超像素 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 超像素是一组外观相似的相连像素。 超像素分割将图像分成数百个不重叠的超像素&#xff08;而不是数千或数百万个单独的像素&#xff09;。通过使用超像素&#xff0c;您可以在更有意义的区…

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. ClionIDF 开发环境搭建一、准备工作二、Clion配置过程1. 使用idf.py命令创建一个范例工程2. 使用Clion打开项目&#xff0c;修改CMakeLists.txt3. 设置交叉编译工具链4. 设置CMake5. 对cmake一些路径进行修改。三、编译及烧录1. 编译2. 烧录3. 查看输出一、准备工…

审核中台业务数据进审升级之路

本文字数&#xff1a;3850字预计阅读时间&#xff1a;15 分钟目录1.背景1.1. 相关名词介绍1.2. 审核中台介绍1.3. 业务痛点介绍2. 规范化改造2.1 规范通讯协议2.2 规范处理流程3. 自动化改造3.1 业务接入检测器3.2 数据自动化流转3.3 源码示例4. 总结1.背景1.1 相关名词介绍1.1…

计算机图形学基础教程(Visual C++版)习题解答与编程实践(第2版)孔令德1-到第3章的直线扫描转换

1-到第3章的直线扫描转换&#xff08;没更新完&#xff09;习题1知识积累习题2知识点映射模式使用GDI对象习题3知识积累直线的中点Bresenham算法习题1 1.计算机图形学的定义是什么?说明计算机图形学、图像处理和模式识别之间的关系。 答&#xff1a; CG是计算机图形学的缩写。…

实验一、旅馆客户服务呼叫显示系统

实验一 旅馆客户服务呼叫显示系统 实验目的 综合应用数字电子技术知识&#xff0c;按照要求设计并完成一个小规模的数字电路系统。进行硬件线路的设计、仿真、焊接、调试与实现。使系统实现一种用于旅馆客户服务呼叫显示系统的实用电路。在呼叫过程中&#xff0c;当8位旅客有…

Spark Core ---- RDD持久化

RDD的数据是过程数据 RDD之间进行相互迭代计算&#xff08;Transformation的转换&#xff09;&#xff0c;当执行开启后&#xff0c;新RDD的生成&#xff0c;代表老RDD的消失 RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见…

【数据结构和算法】实现带头双向循环链表(最复杂的链表)

前文&#xff0c;我们实现了认识了链表这一结构&#xff0c;并实现了无头单向非循环链表&#xff0c;接下来我们实现另一种常用的链表结构&#xff0c;带头双向循环链表。如有仍不了解单向链表的&#xff0c;请看这一篇文章(7条消息) 【数据结构和算法】认识线性表中的链表&…

Spring Boot之SpringSecurity学习

文章目录一 SpringSecurity简介二 实战演示0. 环境 介绍1. 新建一个初始的springboot项目2. 导入thymeleaf依赖3. 导入静态资源4. 编写controller跳转5. 认证和授权6. 权限控制和注销7. 记住登录8. 定制登录页面三 完整代码3.1 pom配置文件3.2 RouterController.java3.3 Securi…

那些面试官口中常常提到b树(MySQL索引底层数据结构)

各种常见树1.树的基本概念2.二叉树3.b树4.b树5.b树与b树的对比5.MySQL索引底层数据结构1.树的基本概念 树的特点&#xff1a;有一个树根&#xff0c;树根上又有很多枝干&#xff0c;枝干上又有很多树枝&#xff0c;树枝上又有很多叶子 树最为一种数据结构也有相似特点 树是一个…