文章目录
- [Spring Boot 优点](#Spring Boot 优点)
- [创建 Spring Boot 项目](#创建 Spring Boot 项目)
- 约定大于配置
- [Spring Boot 配置文件](#Spring Boot 配置文件)
- [Spring Boot 日志文件](#Spring Boot 日志文件)
Spring Boot 优点
- 快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于
- 内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序
- 快速部署项目,无需外部容器也可启动并运行项目
- 可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发
- 支持更多的监控的指标,可以更好地了解项目的运行情况
创建 Spring Boot 项目
创建项目
IDEA 社区版需要安装 Spring Boot Helper 插件,专业版不需要。
新建项目,选择 Spring Initializr,给项目取名,项目类型这里使用 Maven
选择 Next,在下面的页面选择 Spring Boot 版本和需要的依赖
这边选择了三个依赖,Lombok 可以用来快速构建Getter Setter方法。Spring Boot DevTools 用来支持热部署,Spring Web 用来实现网络编程。
选择 Create 开始创建项目,第一次创建会比较慢,需要下载的东西比较多,建议配置国内源。
启动项目,正常启动说明创建成功:
认识目录
首先将下面 4 个无用的文件删除
关于各目录的介绍:
网页创建(了解)
在这里将选项配置好后,点击 GENERATE,会下载一个压缩包,解压,然后用 IDEA 打开即可。
约定大于配置
Spring 核心设计思想------约定大于配置,也就是说,能通过约定解决就不要去动配置文件。
比如我们在创建项目时自动生成的启动文件:
Spring Boot 约定,和这个文件同目录或在该目录的子目录下,对象才可以被注入到容器中。
在之前学习的 Spring 中,我们还需要在 xml 中注册 bean、配置扫描路径,Spring Boot 就不需要了。
例:
在 demo 下面创建 TestController 文件:
java
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/hi")
public String hi() {
return "Hello";
}
}
访问 http://localhost:8080/hi,输出 Hello
如果你把 TestController 文件移动到上级目录,比如 com 下面,再次访问就访问不到了。
Spring Boot 配置文件
配置文件格式
Spring Boot 配置文件主要分为以下两种格式:
- .properties (项目创建时的默认格式)
- .yml(新版配置文件格式)
在 Spring Boot 中,配置文件命名为 application.properties 或 application.yml
这两种配置文件的语法不一样,比如我们要设置端口号:
在 application.properties 下:
properties
server.port=9090
在 application.yml 下
yaml
server:
port: 9090
特别说明:
- properties 和 yml 可以同时存在一个项目中,当它们同时存在一个项目中时,都会被加载,如果两个配置文件中出现了同样的配置,此时为以 properties 中的配置为主,也就是说 properties 配置文件的优先级最高。
- 虽然两个格式的配置文件可以共存,但是实际业务中通常采取一种配置文件格式
- 更多配置项,见官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
- 用户可以自定义配置项
读取配置项
自定义一个配置项:
properties
#自定义配置项
mykey.key1=hahaha
读取配置项:
使用 ${}
来读取配置项的值,非自定义配置项也可以通过这种方式来读取
java
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Value("${mykey.key1}")
private String mykey;
@RequestMapping("/hi")
public String hi() {
return mykey;
}
}
结果:
注:这种方式只能读取基本数据类型,关于其他数据类型在下面的 yml 中会涉及到。
properties 配置文件
使用 #
来注释,使用键值对来进行配置。
例,配置数据库信息:
properties
#设置端口号
server.port=9090
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
优点:
- 写法简单
缺点:
-
不够灵活
-
容易乱码:
比如我写的中文注释,重新打开的时候都变成了
?
properties#????? server.port=9090 #?????????? spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=123456 #?????? mykey.key1=hahaha
这是编码问题导致的,properties 的默认编码格式是 ISO-8859-1
解决方法,在设置里将编码改成 UTF-8(注意当前项目设置和新项目设置都要设置):
yml 配置文件
基本语法
yml 是 YAML 的缩写,全称 Yet Another Markup Language
优点:
- yml 可读性高,写法简单,语法和 JSON 类似
- 支持更多的数据类型,可以简单表达清单(数组)、散列表、标题等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等
- 支持更多的编程语言
yml 语法格式:
一级目录
yaml
key: value
:
后面的空格不可省略
多级目录
yaml
key:
key2:
key3: value
例:多级目录的系统配置项(数据库连接)
yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
username: root
password: 123456
进阶语法
yml 支持很多数据类型:
yaml
#字符串
string: 'Hello, World!'
#整数
number: 42
#布尔
boolean: true
#null
null_value: null
#列表
list:
- item1
- item2
- item3
#字典
dictionary:
key1: value1
key2: value2
#多行字符串
multiline_string: |
This is a multiline
string in YAML.
#日期时间
date_time: 2023-12-06T12:34:56Z
注:
字符串使用不同的引号会有不同的效果,只有使用双引号的时候,特殊字符都会发挥作用。
例:
yaml
mykey:
str1: aaa \n bbb
str2: 'aaa \n bbb'
str3: "aaa \n bbb"
java
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Value("${mykey.str1}")
private String mykey1;
@Value("${mykey.str2}")
private String mykey2;
@Value("${mykey.str3}")
private String mykey3;
@RequestMapping("/hi")
public String hi() {
System.out.println("str1: " + mykey1);
System.out.println("str2: " + mykey2);
System.out.println("str3: " + mykey3);
return null;
}
}
/*输出:
str1: aaa \n bbb
str2: aaa \n bbb
str3: aaa
bbb
*/
配置对象
-
原始写法
yamlstudent: id: 1 name: zhangsan age: 18
-
行内写法
yamlstudent: {id: 1, name: zhangsan, age: 18}
读取配置的对象:
首先要把 Student
类定义出来,给这个类添加 @Component
注解,存到 Spring 中,添加 @ConfigurationProperties(prefix = "student")
注解,表示将配置文件中的 student
配置赋值给当前的对象(为了完成这一步,一定要添加 Setter 方法)。
java
package com.example.demo.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "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;
}
}
接下来我们去获取这个对象,这里采取属性注入的方式:
java
@RestController
public class TestController {
@Autowired
private Student student;
@RequestMapping("/hi")
public String hi() {
return student.getName() + " age: " + student.getAge();
}
}
结果:
注意事项:
- 读取配置文件的实体类不能没有 Setter 方法,@ConfigurationProperties 注解在实现时是通过 Setter 将配置文件中的内容赋值 给字段的
- @ConfigurationProperties 需要配合类注解一起使用
配置集合
-
原始写法
yamlmylist: dbtype: - mysql - sqlserver - db2
-
行内写法
yamlmylist: {dbtype: [mysql, sqlserver, db2]}
例:
首先定义 MyList 类,这次我们使用 lombok 中的 @Data 注解来自动生成 Getter 和 Setter 方法。
java
package com.example.demo.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@ConfigurationProperties(prefix = "mylist")
@Component
public class MyList {
private List dbtype;
}
获取并读取:
java
@RestController
public class TestController {
@Autowired
private MyList myList;
@RequestMapping("/hi")
public String hi() {
return "size: " + myList.getDbtype().size() + " get(0): " + myList.getDbtype().get(0);
}
}
结果:
yml 设置不同环境的配置文件
创建 application-{profile}.yml
格式的配置文件,其中,{profile}
是指激活的环境配置文件的名称。例如,application-dev.yml
将用于开发环境,而 application-prod.yml
将用于生产环境。
在 application.properties
或 application.yml
中设置 spring.profiles.active
属性来指定激活的环境。例如:
properties
# application.properties
spring.profiles.active=dev
或者
yaml
# application.yml
spring:
profiles:
active: dev
这将使 Spring Boot 使用 application-dev.yml
中的配置。
Spring Boot 日志文件
看日志
Spring Boot 项目在启动时就有日志输出:
日志格式
输出自定义日志
- 得到日志对象
- 打印日志
例:
java
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// 1.得到日志对象,注意是 slf4j 包里的,转入的参数表示日志来源于哪个类
private static Logger log = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/hi")
public String hi() {
// 打印日志
log.info("Hello");
return null;
}
}
结果:
将日志持久化
设置日志名称
yaml
#日志保存名称
logging:
file:
name: springboot.log
启动项目即可在项目根目录下面找到 springboot.log 文件,打开就能看到日志
特别注意:
- 日志不会丢失,会一直追加
- 当日志比较大的时候,会自动分割成多个文件
设置日志保存路径
也可以设置日志的路径:
yaml
logging:
file:
name: D:\Test\
启动项目,可以看到这个路径下自动生成了一个 spring.log 文件
设置日志级别 & 筛选日志
通过调用日志对象的不同方法输出不同级别的日志信息
java
log.trace("I am trace");
log.debug("I am debug");
log.info("I am info");
log.warn("I am warn");
log.error("I am error");
日志级别(从低到高)
- trace:微量,少许的意思,级别最低
- debug:调试信息
- info:普通的打印信息
- warn:警告,不影响使用,但需要注意的问题
- error:错误,级别较高的错误日志信息
- fatal:致命的,因为代码异常导致程序退出执行的事件
fatal 没有相应的方法来主动打印出来,fatal 级别的日志只有在程序发生严重错误的时候自动打印。
在之前的操作中,我们没有见过 debug 日志和 trace 日志,因为默认的日志级别是 info,trace 和 debug 日志都被筛选掉了。
在配置文件中设置 logging.level 配置项来筛选日志,输出指定日志级别以及比它级别高的日志信息,屏蔽比它级别低的日志。
logging.level.root 表示根日志,可以理解为所有的日志,默认值为 info。
如下配置,程序只会输出 debug 及级别更高的日志信息
yaml
logging:
level:
root: debug
更精细化的设置:
yaml
logging:
level:
root: warn
com:
example:
demo: debug
以上配置表示,将日志输出的最低级别设置成 warn,而 com.example.demo 下的日志最低级别设置为 debug
更简单的日志输出------lombok
每个类都要 LoggerFactory.getLogger(xxx.class);
来获取日志对象太麻烦了,使用 lombok 可以实现更简单的输出。
使用 @Slf4j
注解,会自动给你提供一个名为 log 的日志对象
java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class TestController {
@RequestMapping("/hi")
public String hi() {
// 打印日志
log.trace("I am trace");
log.debug("I am debug");
log.info("I am info");
log.warn("I am warn");
log.error("I am error");
return null;
}
}
Lombok 的常用注解
基本注解
注解 | 作用 |
---|---|
@Getter | 自动添加 Getter 方法 |
@Setter | 自动添加 Setter 方法 |
@ToString | 自动添加 toString 方法 |
@EqualsAndHashCode | 自动添加 equals 和 hashCode 方法 |
@NoArgsConstructor | 自动添加无参构造方法 |
@AllArgsConstructor | 自动添加全属性构造方法,顺序按照属性定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | 自动添加必需属性的构造方法 |
组合注解
注解 | 作用 |
---|---|
@Data | 等效于 @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode |
日志注解
注解 | 作用 |
---|---|
@Slf4j | 添加一个名为 log 的日志对象 |