整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:
想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的
Spring Boot 配置⽂件主要分为以下两种格式:
.properties
.yml
properies
为主(忽略 yml
中配置)properties 配置⽂件是最早期的配置⽂件格式,也是创建 Spring Boot 项⽬默认的配置⽂件
properties 是以键值的形式
配置的,key 和 value 之间是以“=”
连接的,如:
注意:
配置文件注释用 "#"
修改了还是中文乱码,需要将原来的 application.properties
删除掉,重新在创一个 application.properties
. 因为之前的配置文件已经是不支持中文编码的文件格式化,设置编码在创建 application.properties
之后,所以,后设置的编码不会改变原来的旧的 application.properties
文件,所以需要先将原来的配置先删了在重新创建
使用 @Value
注解来实现,@Value
注解使⽤“${}”
的格式读取,如下代码所示:
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
public class UserController {
@Value("${server.port}")
private String port;
@ResponseBody //返回一个非静态页面的数据
@RequestMapping("/sayhi") //设置路由地址
public String sayHi(){
return "server.port:" + port;
}
}
yml
是 YAML
是缩写,它的全称 Yet Another Markup Language
翻译成中⽂就是“另⼀种标记语⾔”。
yml 是树形结构的配置文件, 它的基础语法是 key: value
, 冒号后面跟着一个空格不能省略
erver:
port: 9090
#连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/java102?characterEncoding=utf8&useSSL=false
name: root
password: root
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
# 浮点数
float.value: 3.1111
float.value1: 314159e-5 # 科学计数法
# Null,~ 代表null
null.value: ~
yml 读取配置的⽅式和 properties 相同,使⽤ @Value
注解即可,实现代码如下:
yml 单,双引号的问题:
结论:
yml 中如果使用了双引号就会按照(原)语义执行,如果不加单,双引号,或者加了单引号,那么默认会将字符串中的特殊字符进行转义,比如 \n => \\n(转义)处理
yml配置:
# 对象写法 1
student:
id: 1
name: 张三
age: 18
# 对象写法 2
student2: { id: 2,name: 李四,age: 20 }
对象:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data //lombok 生成Getter Setter toString 方法
@ConfigurationProperties(prefix="student") //读取配置文件中的对象
@Component
public class Student {
private int id;
private String name;
private int age;
}
测试:
import org.springframework.beans.factory.annotation.Autowired;
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
public class UserController {
@Value("${server.port}")
private String port;
@Value("${mystring}")
private String mystring;
@Value("${mystring2}")
private String mystring2;
@Value("${mystring3}")
private String mystring3;
@Autowired
private Student student;
@ResponseBody //返回一个非静态页面的数据
@RequestMapping("/sayhi") //设置路由地址
public String sayHi(){
System.out.println("mystring: "+mystring);
System.out.println("mystring2: "+mystring2);
System.out.println("mystring3: "+mystring3);
System.out.println(student);
return "server.port:" + port;
}
}
yml配置:
# 集合
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") // 读取配置文件中集合
public class ReadList {
private List<String> name;
}
测试:
import org.springframework.beans.factory.annotation.Autowired;
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;
import javax.annotation.Resource;
@Controller
public class UserController {
@Value("${server.port}")
private String port;
@Value("${mystring}")
private String mystring;
@Value("${mystring2}")
private String mystring2;
@Value("${mystring3}")
private String mystring3;
@Autowired
private Student student2;
@Resource
private ReadList readList;
@ResponseBody //返回一个非静态页面的数据
@RequestMapping("/sayhi") //设置路由地址
public String sayHi(){
System.out.println("mystring: "+mystring);
System.out.println("mystring2: "+mystring2);
System.out.println("mystring3: "+mystring3);
System.out.println(student2);
return "readList: " + readList.getName();
}
}
yml另一种写法:
dbtypes1:
name:
- mysql
- sqlserver
- db2
properties
是以 key=value
的形式配置的键值类型的配置⽂件,⽽ yml
使⽤的是类似 json
格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂冒号加空格的⽅式设置
,并且空格不可省略
。
properties
为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml
可以很好的解决数据冗余的问题。
yml
通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置⽂件作为 Java 和 Go 的共同配置⽂件。
yml
虽然可以和 properties
共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件