SpringBoot配置文件properties和yml的实现
SpringBoot配置文件properties和yml的实现
目录配置文件的作用SprintBoot的配置文件(两种):propertiesyml读取配置文件的方法:@Value注解读取单个配置项@ConfigurationProperties读取实体类properties VS yml 总结
配置文件的作用
通常情况下,一个项目中的一些重要信息都会放在配置文件中,比如:数据库的连接信息、项目的启动端口、一些第三方的秘钥、记录信息的普通日志和异常日志等。
SprintBoot的配置文件(两种):
Spring Boot的配置文件主要有两种格式:
.properties和.yml
这两种格式的配置文件可以共同存在于一个项目中,但一般情况下我们会统一格式,只使用其中的一种,来降低故障率。.properties是最早期的SpringBoot配置文件的格式,也是现在默认的配置文件格式,出现的时间早于.yml。当这两个配置文件中出现相同的配置时,会优先执行.prhttp://operties中的配置,然后再执行.yml中的配置,即.properties的优先级大于.yml
properties
创建SpringBoot项目后会自动生成一个配置文件,在该文件中,信息以键值对的形式进行储存。
# 配置项目的信息
# key=value
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
如果我们想要在这个文件中配置一些信息,可以在遵循key-value格式下,可以定义任意名称的key
缺点:对于同一个对象的多个属性进行设置时很麻烦,需要多次重复,存在冗余配置项。如下,当我们想要设置同一个对象很多的信息时,需要多次重复这个信息:
而yml就很好的解决了这个问题。
yml
yml是YMAL的缩写,全称是 Yet Another Markup Language,另一种标记语言。YMAL是一个可读性高、易于理解、用来表达数据序列化的格式。YMAL的作用是可以做到跨语言使用,不仅java中可以使用,Go和python中都可以使用。
1.语法格式:
key: value表示键值对关系,冒号后面必须加一个空格大小写敏感缩进时不允许使用tab键,只能用空格左对齐的一列数据就表示同一级松散表示,java使用驼峰命名,而用原名或者-代替都可以正确映射,比如java中的名称是lastName,yml中使用lastName或者last-name都可以映射到。
2.键值关系
# 通常写法:
student:
id: 1
name: 张三
age: 20
# 行内写法
student: { id: 1,name: 张三, age: 20}
yml中,字符串默认不需要加上单引号或者双引号使用双引号:不会转义字符串中的特殊字符,特殊字符会作为本身想要表达的意思:比如 name: “zhangsan \n 23”,会输出:zhangsan 换行 23使用单引号:会转义特殊字符,特殊字符失去特殊作用变成普通字符。
在配置文件中,它是以键值对的形式储存信息的,如果是自己配置的信息,你可以在遵循key-value的格式下,定义任何名称的key.
使用YML连接数据库:
sping:
datasource:
url:jdbc: mysql://127.0.0.0:3306/dbname?characterEncoding=tuf8
username: root
password: root
表示常用的字面量:
# 普通字面量
name: zhangsan
age: 18
#布尔类型
flag: true
#日期
date: 2022/04/15
# 同一个对象的多个属性
people:
name: lisi
age: 20
# 数组
# 用 -表示数组中的一个元素
pets:
- cat
- dog
- pig
# 行内写法
petss: [dog,cat,pig]
# list对象、set对象、数组对象
students:
- name: zhangsan
age: 22
- name: lisi
age: 20
- {name: wangwu,age: 18}
读取配置文件的方法:
@Value注解读取单个配置项
如果我们想要主动的读取配置文件中的信息,可以使用注解@Value。
使用格式:
@Value("${server.port}")
private String port;
在属性前加上@Value注解,后面的括号写入要读取的配置中哪个key,比如读取下面的server.port,注意格式:双引号+${}
# 配置项目端口
server.port=8080
在测试类中得到这个值并进行打印:
package com.example.demo;
import Controller.TestReadYml;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication implements InitializingBean {
@Value("${server.port}")
private String port;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(" ");
System.out.println("读取到信息:"+port);
System.out.println(" ");
}
}
输入:
@ConfigurationProperties读取实体类
1.将配置文件中的一组对象映射到实体类上:
使用格式:
@Component //spring 启动时直接将配置文件映射到当前类属性上
@ConfigurationProperties("student") //student是在配置好的key
举例:在yml配置文件中,我们创建一个student对象:
student:
id: 1
name: 张三
age: 20
将这个对象映射到Student类中,也就是从配置文件里读取到类中,
package model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component //spring 启动时直接将配置文件映射到当前类属性上
@ConfigurationProperties("student")
public class Student {
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;
}
}
2.使用注入的方式将对象注入到一个类中
在启动类中注入Student类进行使用:
package com.example.demo;
import com.example.demo.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@SpringBootApplication
@Component
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
//属性注入
@Autowired
private Student student;
@PostConstruct
private void postConstruct(){
System.out.println("Read Yml:"+student);
}
}
输出:
Read Yml:Student{id=1, name='张三', age=20}
注意包路径配置的问题!!!启动类和要注入的类包必须放在同级目录下,否则读取不到,会显示启动失败Application failed to start.
properties VS yml 总结
yml语法更简洁,可以解决数据冗余问题yml跨语言的通用性更好,它不支持java语言还支持golang 和pythonyml 支持更多的数据类型yml格式的配置文件在写的时候更容易出错(冒号后面需要加一个空格),而properties虽然写法更复杂但是不容易出错。yml虽然可以和properties共存,但一个项目中最好统一格式,只用其中的一个。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~