JavaEE10-Spring Boot配置文件

news/2024/11/22 22:33:41/

目录

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=utf8username: rootpassword: 12345678driver-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 {@Autowiredprivate 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.portprivate 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;@PostConstructpublic 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.ppmy.cn/news/19943.html

相关文章

1.设计模式的前奏

哪些维度评判代码质量的好坏&#xff1f; 常用的评价标准 可维护性&#xff08;maintainability&#xff09;:维护代码的成本可读性&#xff08;readability&#xff09;可扩展性&#xff08;extensibility&#xff09;&#xff1a;码应对未来需求变化的能力灵活性&#xff0…

11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题

本篇文章是Java方法的专题练习,从第五题开始难度增大,涉及大厂真题,前四道题目是基础练习,友友们可有目的性的选择学习&#x1f618;&#x1f495; 文章目录前言一、数组的遍历1.注意点:输出语句的用法2.题目正解二、数组最大值三、判断是否存在四、复制数组五、案例一:卖飞机票…

XC-16 SpringSecurity Oauth2 JWT

SpringSecurityOauth2用户认证需求分析用户认证与授权单点登录需求第三方认证需求用户认证技术方案单点登录技术方案Oauth2认证Oauth2认证流程2.2.2Oauth2在本项目中的应用SpringSecurity Oauth2认证解决方案SpringSecurityOauth2研目标搭建认证服务器导入基础工程创建数据库Oa…

万字长文--详解Node.js(快速入门)

Node.js基础与扩展Node.js1、初识Node.js与内置模块1.1 Node.js初识1.2 fs文件系统模块1.3 path路径模块1.4 http模块2、模块化2.1 模块化的基本概念2.2 Node.js中模块化2.3 npm与包2.4 模块的加载机制3、Express3.1 初识Express3.2 Express路由3.3 Express中间件3.4 使用Expre…

python图像处理(图像缩放)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像缩放也是isp处理的一个基本功能。现在的camera像素越来越大,但是显示设备的分辨率是一定的,如果想把图像显示在显示器或者lcd上面,那就要符合对应显示设备的分辨率。一般来说…

C++11中的完美转发

C11中的完美转发 在讨论引用折叠这个话题之前&#xff0c;先回顾一下C11中的引用&#xff0c; 在C11中引用有4种&#xff1a;非常量左值引用、非常量右值引用、常量左值引用、常量右值引用。其中常量右值引用没有应用价值,所以我们不考虑。 非常量左值引用只能绑定非常量左值…

编译原理学习笔记14——属性文法与语法制导翻译1

编译原理学习笔记14——属性文法与语法制导翻译114.1 属性文法14.2 属性计算14.1 属性文法 属性文法 综合属性 自下而上传递信息语法规则&#xff1a;根据右 部候选式中的符号 的属性计算左部被 定义符号的综合属性语法树&#xff1a;根据子结 点的属性和父结点 自身的属性…

《C++程序设计原理与实践》笔记 第11章 定制输入/输出

在本章中&#xff0c;我们重点关注如何使第10章中介绍的通用iostream框架适配特定的需求和偏好。 11.1 规则性和不规则性 C标准库的输入/输出部分——iostream库为文本的输入和输出提供了一个统一的、可扩展的框架。 到目前为止&#xff0c;我们将所有输入源视为等价的&…