目录
Spring Book 配置文件
一. 配置文件
1.配置文件的作用
配置文件主要为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。
使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他程序的交互
2.配置文件的格式
Spring Book配置文件共有三种:
- application.properties
- application.yml
- application.yaml
当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载application.properties 和 application.yaml 或者 application.yml ⽂件
说明:
- .properties文件和.yml文件是可以共存在同一个项目中的,当配置文件内容有冲突时,则以 .properties文件为主, .properties文件优先级更高
- 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)
二. .properties配置文件
1. .properties配置文件说明
.properties是创建Spring Book项目 默认的配置文件
# 配置项⽬端⼝号
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
配置文件使用 "#" 来添加注解信息
2.读取配置文件
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。 @Value 注解使⽤(" ${} ")的格式读取,如下代码所⽰: 配置如下:myKey = bb
myKey.key1 = aa
@RestController
public class PropertiesController {
//使用value("${}") 从配置文件中获取自定义信息 赋值给变量key1
@Value("${mykey.key1}")
private String key1;
@Value("${mykey}")
private String key;
@RequestMapping("/key1")
public String key1(){
return "读取到值:"+key1;
}
@RequestMapping("/key")
public String key(){
return "读取到值:"+key;
}
}
三.yml配置文件
1. .yml配置文件说明
yml 是树形结构的配置⽂件,它的基础语法是"key: value". key 和 value 之间使⽤英⽂冒号加空格的⽅式组成, 空格不可省略 基础语法如下://正确的代码格式
myKey: bb
myKey.key1: aa
//错误的代码格式
mykey:a
2.使⽤ yml 连接数据库
#数据库连接配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mapper-locations: classpath:mybatis/**Mapper.xml
# 配置打印 MyBatis日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰⾃动转换
3.yml 配置不同数据类型及 null
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''
4.yml配置读取
yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可,实现代码如下: yml配置:string:
hello: n
@RestController
public class Controller {
@Value("${string.hello}")
private String hello;
@RequestMapping("/hello")
public String Hello(){
return "获取yml配置:"+hello;
}
}
5.主要事项:value值加单双引号
字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。 尝试在 application.yml 中配置如下信息:string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
@RestController
public class Controller {
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@RequestMapping("/yml")
public String readYml(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "yml";
}
}
//执行结果:
// Hello \n SpringBoot.
// Hello \n SpringBoot.
// Hello
// SpringBoot.
从上述结果可以看出:
此处的转义理解起来会有些拗⼝, \n 本意表⽰的是换⾏ 使⽤单引号会转义, 就是说, \n 不再表⽰换⾏了, ⽽是表⽰⼀个普通的字符串 使⽤双引号不会转义, 表⽰ \n 表⽰的是它本⾝的含义, 就是换⾏
- 字符串默认不⽤加上单引号或者双引号。
- 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
- 双引号不会转义字符串⾥⾯的特殊字符, 特殊字符会表⽰本⾝的含义.
6.配置对象
.yml中配置对象,如下格式:
# 配置对象 student: name: lisi id: 18 age: 20
注意" : "后面加空格
这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties 来读取,具体实现如下:
package com.example.springiocdemo.entity; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; @ConfigurationProperties("student") @Component @Data public class Student { private String name; private Integer id; private Integer age; }
调用类如下:
@RequestMapping("yml")
@RestController
public class Readymlcontroller {
@Autowired
private Student student;
@RequestMapping("readStudent")
public String readStudent(){
return "从yml中获取配置文件Student:"+student;
}
}
7.配置集合
配置list集合,如下所⽰:
dbtypes:
name:
- mysql
- sqlserver
- db2
集合的读取和对象一样,使用@ConfigurationProperties 来读取的
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
8.配置Map
以配置 map,如下所⽰: # 配置Map
map:
k1: kk1
k2: kk2
k3: kk3
map的读取和对象一样,使用@ConfigurationProperties 来读取的
@Component
@ConfigurationProperties(prefix = "maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
四.配置文件总结:
1.配置的转换:
2.单双引号的区别
3.对应关系:
4.yml优缺点:
优点:
- 可读性高,写法简单,易于理解
- 支持更多的数据类型,可以简单表达对象,数组,list,Map,的数据形态
- 支持更多的编程语言,不只是java中可以使用,在Golang,Python,JavaScript也可以使用
缺点:
- 不适合写复杂的配置⽂件
- 对格式有较强的要求(可能一个空格导致整个项目垮掉)
Spring Book 日志
一.日志的作用
⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途:- 系统监控
- 数据采集
- 日志审计
二.日志的使用
Spring Book项目 在启动的时候默认就有日志输出,如图所示:
System.out.print 打印的⽇志, ⽐ SpringBoot 打印的⽇志缺少了很多信息. SpringBoot 内置了⽇志框架 Slf4j , 我们可以直接在程序中调⽤ Slf4j 来输出⽇志
1.使用日志对象打印日志
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所⽰:@RequestMapping("Logger")
@RestController
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/getLogger")
public String logger(){
logger.info("--------------要输出⽇志的内容----------------");
return "打印⽇志";
}
}
打印日志结果:
2.日志框架
SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范, 标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤
2.1⻔⾯模式(外观模式)
⻔⾯模式定义 ⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使用: ⻔⾯模式主要包含2种⻆⾊: 外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝. ⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类, ⽽是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个 客⼾端⽽已(即 Facade 对 SubSystem 透明)⽐如去医院看病,可能要去挂号, ⻔诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待⼈ 员, 只让接待⼈员来处理, 就很⽅便.门面模式的优点:
- 减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它 的客⼾端; •
- 提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需 要和⻔⾯对象交互即可.
- 提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问
3. SLF4J框架
SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的 ⽇志逻辑实现 打印的日志分别代表什么:从上图可以看到,⽇志输出内容元素具体如下:
- 时间⽇期:精确到毫秒
- ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
- 进程ID
- 线程名
- Logger名(通常使⽤源代码的类名)
- 日志内容
3.1日志的级别:
⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误. ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏. WARN: 警告信息, 不影响使⽤, 但需要注意的问题 INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等. DEBUG: 调试信息, 需要调试时候的关键信息打印. TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
3.2日志级别的使用:
针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志@RequestMapping("/printLog")
public String printLog() {
logger.trace("================= trace ===============");
logger.debug("================= debug ===============");
logger.info("================= info ===============");
logger.warn("================= warn ===============");
logger.error("================= error ===============");
return "打印不同级别的⽇志" ;
}
⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就 是info, warn和error.
3.3配置⽇志级别
⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所⽰:
logging:
level:
root: debug
3.4配置日志文件名
# 设置⽇志⽂件的⽂件名 logging: file: name: logger/springboot.log
3.5配置日志的存储目录
# 设置⽇志⽂件的⽬录 logging: file: path: D:/temp
注意:logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀, 以logging.file.name 为准.
3.6配置⽇志⽂件分割
logging:
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
三.更简单的日志输出
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐, 且每个类都添加⼀遍, lombok给我们提供了 ⼀种更简单的⽅式
- 添加lombok框架支持
- 使用 @slf4j 注解输出日志
添加 lombok 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
输出⽇志
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
//引入 @Slf4j注解
@Slf4j
@RestController
public class LogController {
public void log(){
//lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象 log, 我们直接使⽤就可以
log.info("--------------要输出⽇志的内容----------------");
}
}
总结:
标签:properties,配置文件,Spring,配置,public,Book,日志,yml From: https://blog.csdn.net/2401_83177222/article/details/145152102
- ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot 内容了⽇志框架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
- ⽇志包含 6 个级别, ⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称 或保存⽬录来将⽇志持久化