我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中.
整个项目中所有重要的数据都是在配置文件中配置的,比如:
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
Spring Boot 配置文件主要分为以下两种格式:
特殊说明:
如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了"server.port", 那么这个时候会以 properties 中的配置为主,也就是 properties 配置文件的优先级最高,但加载完.properties 文件之后,也会加载 .yml 文件的配置信息
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件.
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
# 配置项目端口号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
注: 配置文件中使用“#”来添加注释信息
配置项分类:
IDEA默认这个配置文件不支持中文, 也就是说如果写了中文的注释, 下次启动就变成乱码了. 针对这种情况, 可以在IDEA中Settings搜索file encoding进行设置.(注意"新建项目"也同时要设置)
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现.
@Value 注解使用“${}”的格式读取,如下代码所示:
package com.example.demo.component;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYml {
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("Read YML, port: " + port);
}
}
最终执行效果:
@Component 在Spring Boot 启动时候会注入到框架中,注入到框架中时会执行 @PostConstruct初始化方法,这个时候就能读取到配置信息了。
优点:
缺点:
写法比较冗余。
yml是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另一种标记语”
yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒汗加空格的方式组成的,其中的空格不可省略。
yml示例如下:
server:
port: 9999
yml使用示例:
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
username: 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.14159
float.value1: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~
yml 读取配置的方式和 properties 相同, 使用@Value注解即可, 实现代码如下:
package com.example.demo.component;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYml {
@Value("${string:hello}")
private String hello;
@PostConstruct
public void postConstruct() {
System.out.println("Read YML, hello: " + hello);
}
}
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
尝试在 application.yml 中配置如下信息:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
package com.example.demo.component;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYml3 {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@PostConstruct
public void postConstruct() {
System.out.println("string.str1: " + str1);
System.out.println("string.str1: " + str2);
System.out.println("string.str1: " + str3);
}
}
从上述结果可以看出:
student:
id: 1
name: 张三
age: 18
package com.example.demo.entity;
@ConfigurationProperties("student")
@Component
@Setter
@Getter
@ToString
public class StudentComponent {
private int id;
private String name;
private int age;
}
注意:以上代码中的 getter 和 setter 方法不能省略.(本文使用lombok, 所以省略)
package com.example.demo.component;
import com.example.demo.entity.StudentComponent;
@Component
public class ReadYml4 {
@Autowired
private StudentComponent studentComponent;
@PostConstruct
public void postConstruct() {
System.out.println(studentComponent);
}
}
想要查看 Spring Boot 更多系统配置项,访问官网: Common Application Properties
Spring Boot 内置了日志框架, 在启动的时候默认就有日志输出,如下图所示:
下图是常用的一个日志框架, 其中SLF4J和logback是Spring Boot所内置的日志框架.
SLF4J是门面模式, 它类似于代理模式, 是设计模式的一种, 就是来了用户之后, 它不是直接具体去操作某一个日志框架, 而是由某一个代理(门面)先行处理.
也就是用户在写日志时, 首先请求会先来到门面模式SLF4J, 然后SLF4J再根据我们系统的配置决定我们要调用的具体的框架是什么.
类似于生活中买房子先通过中介(SLF4J), 中介能够根据我们的诉求来匹配最合适的房源.
Spring Boot自定义日志打印的步骤:
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:
// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
注意: Logger 对象是属于 org.slf4j 包下的,不要导入错包.
日志对象的打印方法有很多种,我们可以先使用 info()方法来输出日志,如下代码所示:
logger.info("--------------打印日志------------");
日志的级别分为:
日志级别的顺序:
越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了
在配置文件中设置:
logging:
level:
root: error
com:
example:
demo:
controller: trace
清除掉配置文件中的日志设置,观察控制台输入的日志级别得到以下结论,日志的输出级别,默认是 info.
以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
注: 日志文件一旦产生,那么日志文件及其内容就会永久的保存,不会出现文件或内容的丢失,无论任何操作都会保持其以上特性。
配置日志文件的保存路径:
logging:
file:
path: D:\LearningSoftware
配置日志文件的文件名:
logging:
file:
name: D:\\springboot.log
根据业务场景来订, 生产级别日志分类:
1.程序运行日志(存放在文件中)
2.业务日志(存放到数据库)
每次都使用 LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,也很麻烦,这里讲一种更好用的日志输出方式,使用 lombok 来更简单的输出
1.添加 lombok 框架支持
2.使用 @slf4j注解输出日志。
org.projectlombok
lombok
true
Spring Boot是默认添加的
package com.example.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class LogController {
@RequestMapping("/log/sayhi")
public String sayhi(){
log.info("log的info");
return "log say hi";
}
}
注意:使用 @SIf4j 注解,在程序中使用 log 对象即可输入志,并且只能使用 log 对象才能输出, 这是lombok 提供的对象名。
注解 |
作用 |
---|---|
@Getter |
自动添加getter 方法 |
@Setter |
自动添加setter方法 |
@ToString |
自动添加 toString 方法 |
@EqualsAndHashCode |
自动添加 equals 和hashCode 方法 |
@NoArgsConstructor |
自动添加无参构造方法 |
@AllArgsConstructor |
自动添加全属性构造方法,顺序按照属性的定义顺序 |
@NonNull |
属性不能为null |
@RequiredArgsConstructor |
自动添加必需属性的构造方法,final + @NonNull 的属性为必需 |
注解 |
作用 |
---|---|
@Data |
@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
注解 |
作用 |
---|---|
@SIf4j |
添加一个名为 log的日志,使用 slf4j |
lombok能够打印日志的原理就在于它所应用的是在编译的时候自动添加得到日志对象的代码, 可以在target中看到:
Java程序运行原理:
lombok的作用如下: