日升时奋斗,日落时自省
目录
1、配置文件作用
2、配置文件格式
2.1、使用注意
3、properties配置文件
3.1、注释中文问题
3.2、properties语法格式
3.3、读取配置文件
3.3.1、Value读取
3.3.2、PropertySource读取
3.3.3、原生方式读取配置文件
3.4、properties缺点分析
4、yml配置文件
4.1、优点分析
4.2、yml语法格式
4.2.1、设置不同数据类型
4.2.2、yml配置读取
4.2.3、配置对象
4.2.4、配置集合
5、properties和yml区别
1、配置文件作用
配置文件是一种存储应用程序配置信息的文件,通常采用纯文本格式
<1>存储应用程序的配置参数:在软件开发过程中,很多参数需要在运行时进行调整,例如数据库连接、日志级别等。通过配置文件,可以将这些参数组织起来并进行统一管理
<2>方便程序的部署:在程序部署时,需要根据不同的环境进行不同的配置,例如开发环境、测试环境和生产环境等。通过配置文件,可以轻松地进行环境切换,从而方便程序的部署和管理
2、配置文件格式
Spring Boot配置文件主要分为两种格式:
.properties (比较老的格式)
.yml(也能写作.yaml 都算是新版格式)
两者都是可以出现在一个目录下使用的(使用就是同时存在而且还能跑)
类似于纸币,旧纸币和新纸币,.properties 后缀的配置文件 就类似于“旧纸币”,.yml类似于“新纸币”但是效果都是一样的100元,不能当50元用嘛,还是原来的价值(都可以使用,也可以并存)
2.1、使用注意
<1>虽然.properties文件和.yml文件是可以在同一个项目中,但是这样也会有所影响,.properties文件的优先级还是比较高的,.properties配置文件会先进行加载,.yml配置文件也加载但是需要在.properties配置文件之后
<2>尽可能的使用一种格式的配置文件,便于维护(降低故障可能性),推荐在刚刚开始学习SpringBoot的时候使用.properties配置文件
3、properties配置文件
properties配置文件是早期文件格式,也是默认格式,在创建Spring Boot项目时,会直接创建好
3.1、注释中文问题
有的友友肯定会遇到注释中文乱码
在配置文件中输入 中文注释,当关闭idea再次打开时就会出现乱码
不如提前解决这个问题,以免后面遇到了临时处理很慌乱(提前预判)(修改两个地方)
<1>当前项目修改字符集
<2>修改新项目的字符集
最后操作:就是把本项目刚刚加载的properties配置文件给删了,自己从新创建一个,就也是utf-8字符集
3.2、properties语法格式
properties是键值对的形式配置的,键值连接方式是 “= ”连接的
这里演示几个给友友们看,这里推荐友友们下载一个插件(这是社区版的插件,可以支持配置文件的快捷提示,方面我们输入)
File -> Settings -> plugins
安装完成后,idea重启 就可以了
# 首次使用properties配置文件
#配置文件中 设置端口号
server.port=8080
#设置数据库连接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/class?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
#也可以自定义 设置键值对
javaclass=myclass
3.3、读取配置文件
配置不仅仅可以设置连接,端口号等固定操作,还可以设置自定义,在项目中会有主动读取配置文件内容情况,这里就涉及到了一个新的注解@Value来实现
3.3.1、Value读取
使用操作:@Value("${key}") 这里的key就是键
就以上面的配置文件为例,我们拿一下 端口号 和 自定义设置的键值对
@RestController //相当于 @Controller注解 和 @ResponseBody注解
@RequestMapping("/test") //设置路由
public class TestController {
@Value("${server.port}")
public String port;
@Value("${javaclass}")
public String mystr1;
@RequestMapping("/port") //设置二级路由
public void sayhi(){
System.out.println("从配置文件中拿出的端口号:"+port);
System.out.println("自定义配置文件键值对取值:"+mystr1);
}
}
类写完之后,开始启动Maven ,此时启动控制台并不会打印什么,需要访问这里写的myport路由
控制台才会显示打印结果
运行结果: 都是我们刚刚配置文件中设置的
3.3.2、PropertySource读取
@PropertySource注解读取方法只能读取properties配置文件
下面就来演示@PropertySource注解的读取操作,这里是指定读取哪个properties配置文件
使用一个类来演示
//组合注解
@RestController
//该注解 指定读取的配置文件 如果出现乱码问题也可以设置字符集
@PropertySource(value = "application.properties",encoding = "utf8")
//设置路由地址
@RequestMapping("/proper")
public class ProperController {
@Value("${server.port}")
private String port;
@Value("${spring.datasource.url}")
private String url;
@RequestMapping("sayhi")
public void sayhi(){
System.out.println("指定配置文件获取端口:"+port);
System.out.println("指定配置文件获取连接:"+url);
}
}
剩下部分就交给启动了,启动后需要访问路由才能看见打印结果
运行结果:(友友们也可以从新创建一个properties配置文件进行操作,两个配置文件中设置不同的端口号,想要加载那个就给注解中添加那个配置文件)
注:该注解只能支持properties为后缀的配置文件
3.3.3、原生方式读取配置文件
原生的读取配置文件的方式是使用 Properties 类,该类只支持以 .properties 为后缀的属性文件,不支持读取 YAML 格式的配置文件
@RestController
@RequestMapping("/native")
public class NativeController {
@RequestMapping("/sayhi")
public void sayhi() throws IOException {
//创建properties对象
Properties properties=new Properties();
//获取配置文件中的字节 同时设置字符集
InputStreamReader inputStreamReader=new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("application.properties"),
StandardCharsets.UTF_8);
//properties配置文件加载字节流
properties.load(inputStreamReader);
//获取后就可以直接进行打印了
System.out.println("Properties port:"+properties.getProperty("server.port"));
}
}
3.4、properties缺点分析
properties配置是以键值对的形式配置的
但是配置冗余代码过多,前面写有一个连接数据库的配置(url,username,password前缀相同但是都需要再写一次)
当然除了这个缺点,有个有利于我们的优点就是格式很简单(“=”号连接的键值对),允许空格随便打
4、yml配置文件
yml全称是yaml(Yet Another Markup Language),是一种基于文本的数据序列化语言,这里说yml是一种“语言”,是一种新的通用数据序列化格式(操作简洁)
4.1、优点分析
<1>易读性高:YAML的语法结构简单、清晰,易于理解和阅读。它的格式类似于自然语言,可以直接将数据表示为键值对,而不需要大量的标记和转义字符。
<2>可维护性高:由于YAML的易读性,它更容易维护和修改。在开发过程中,程序员可以使用YAML格式的配置文件轻松地进行调试和修改,而无需关心底层的数据结构。
<3>支持多种类型的数据:除了常见的字符串、数字、布尔值之外,YAML还支持数组、哈希表等多种类型的数据,能够满足各种应用场景的需求。同时,YAML也支持一些高级特性,比如引用和锚点等,方便用户在大型文件中进行数据共享和重复利用。
<4>平台无关性:YAML是基于文本的数据序列化格式,不依赖于任何特定的编程语言或操作系统平台,因此具有良好的跨平台可移植性。
<5>支持编程语言更为丰富,它不止限制于java使用,也可以使用在Python、PHP、JS等
虽然优点很多,但是初学者使用Spring Boot不推荐使用,格式规定简洁能省很多事情,但是格式是比较固定的,不谨慎容易出错
4.2、yml语法格式
yml是树形结构的配置文件,优点类似于Python的基础语法格式,空格划分等级,这里也是使用键值方式,连接键值方式 “key: value”
注:key后面有一个:冒号和一个空格,这个空格不能少(少了会报错)
这里就还是拿刚刚properties的配置再yml中再写一下
#yml配置文件 设置端口号
server:
port: 8080
# 设置连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/class?characterEncoding=utf8
username: root
password: root
#设置自定义 键值
javaclass: myclass
代码冗余减少了,连接数据库需要写一次spring: datasource:
4.2.1、设置不同数据类型
#设置字符串 以下这些都是我们自己设置的键值 不是yml中自带的
string.value: string-hello
#设置布尔类型
boolean.value: true;
#设置整数
int.value: 100
#设置浮点数
float.value: 2.712
float.value1: 2712e-5 #使用科学计数法
#NULL表示 ~
null.value: ~
4.2.2、yml配置读取
yml的读取操作和properties配置文件基本是一样的,使用@Value注解 参数中除了把key放入,注意:不是使用:冒号连接,这里获取对象是.点来连接,现在我们先把刚刚properties配置文件中的内容注释掉, 以免影响yml加载,properties加载早于yml,也会优先使用properties
还是在controller包中添加一个新类在写yml读取,ReadYml类
4.2.3、配置对象
在配置文件中也可以写一个对象以及对象的属性
下面就来展示一下
#可以写成键值不同等级的形式
student:
id: 1
name: 白无常
age: 20
#也可以将对象直接写成类似数组的形式 行内写法
student1: {id: 2,name: 黑无常, age: 25}
针对对象的读取就不能通过@Value注解来实现了,需要使用另外一个注解,此处又要接触一个新的注解了@ConfigurationProperties注解来读取
读取对象是将配置文件中的对象获取,所以要添加注解加载配置文件中指定的对象
这里需要创建一个对应的实体类,当然也不一定完全需要,多几个属性,最多就是值为null
实体类代码:
@ConfigurationProperties(prefix = "student") //加载配置文件中 对应到的对象
@Component //类注解
@Setter//lombok set方法注解
@Getter//lombok get方法注解
@ToString//lombok toString方法注解
public class StudentComponent {
private int id ;
private String name;
private int age;
}
控制层代码:
@RestController //相当于 @Controller注解 和 @ResponseBody注解
@RequestMapping("/test") //设置路由
public class TestController {
@Value("${server.port}")
public String port;
@Value("${javaclass}")
public String mystr1;
@Autowired
private StudentComponent studentComponent;
@RequestMapping("/port") //设置二级路由
public void sayhi(){
System.out.println("从配置文件中拿出的端口号:"+port);
System.out.println("自定义配置文件键值对取值:"+mystr1);
System.out.println(studentComponent.toString());
}
}
4.2.4、配置集合
配置文件也可以存放list集合,写法上和对象有几分相似
配置文件代码 ,这里写的代码也是yml文件中写的
#设置集合
databasetypes:
name: [mysql,sqlserver,db]
#集合的行内写法
databaserow: {name: [mysql,sqlserver,db]}]}
读取集合:
这里我们还需要创建一个实体类来接收这个集合 (如下操作)
针对集合创建的实体类:
@ConfigurationProperties(prefix = "databasetypes")
@RestController
@Setter
@Getter
@ToString
public class StudentComponent2 {
private List<String> name;
}
注:prefix如果注解中参数只有一个,可以加也不加,前面写的就没有加
属性注入,这里就不在附加代码了,在之前附加的代码上添加即可
当然了,系统配置不是就止于此(有需求的友友们,可以自行去官网看看,下面是官网网址)
Common Application Properties
5、properties和yml区别
<1>语法:Properties 使用简单的键值对格式,例如 key=value;而 YAML 使用缩进和换行来表示数据结构
<2>数据类型:Properties 中的值只能是字符串类型;而 YAML 支持多种数据类型,例如字符串、整数、浮点数、布尔值、日期等
<3>复杂度:Properties 的数据结构相对简单,通常用于存储简单的配置信息;而 YAML 支持复杂的数据结构,例如列表、嵌套结构等,更适合存储较为复杂的数据
<4>可读性:由于 YAML 使用缩进和换行进行格式化,具有很好的可读性和易用性,更容易被人类阅读和编辑;而 Properties 的格式相对简单,不够直观