IDEA 社区版需要安装 Spring Boot Helper 插件,专业版不需要。
新建项目,选择 Spring Initializr,给项目取名,项目类型这里使用 Maven
选择 Next,在下面的页面选择 Spring Boot 版本和需要的依赖
这边选择了三个依赖,Lombok 可以用来快速构建Getter Setter方法。Spring Boot DevTools 用来支持热部署,Spring Web 用来实现网络编程。
选择 Create 开始创建项目,第一次创建会比较慢,需要下载的东西比较多,建议配置国内源。
启动项目,正常启动说明创建成功:
首先将下面 4 个无用的文件删除
关于各目录的介绍:
前往官网:https://start.spring.io/
在这里将选项配置好后,点击 GENERATE,会下载一个压缩包,解压,然后用 IDEA 打开即可。
Spring 核心设计思想——约定大于配置,也就是说,能通过约定解决就不要去动配置文件。
比如我们在创建项目时自动生成的启动文件:
Spring Boot 约定,和这个文件同目录或在该目录的子目录下,对象才可以被注入到容器中。
在之前学习的 Spring 中,我们还需要在 xml 中注册 bean、配置扫描路径,Spring Boot 就不需要了。
例:
在 demo 下面创建 TestController 文件:
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 中,配置文件命名为 application.properties 或 application.yml
这两种配置文件的语法不一样,比如我们要设置端口号:
在 application.properties 下:
server.port=9090
在 application.yml 下
server:
port: 9090
特别说明:
自定义一个配置项:
#自定义配置项
mykey.key1=hahaha
读取配置项:
使用 ${}
来读取配置项的值,非自定义配置项也可以通过这种方式来读取
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 中会涉及到。
使用 #
来注释,使用键值对来进行配置。
例,配置数据库信息:
#设置端口号
server.port=9090
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
优点:
缺点:
不够灵活
容易乱码:
比如我写的中文注释,重新打开的时候都变成了 ?
#?????
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 是 YAML 的缩写,全称 Yet Another Markup Language
优点:
yml 语法格式:
一级目录
key: value
:
后面的空格不可省略
多级目录
key:
key2:
key3: value
例:多级目录的系统配置项(数据库连接)
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
username: root
password: 123456
yml 支持很多数据类型:
#字符串
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
注:
字符串使用不同的引号会有不同的效果,只有使用双引号的时候,特殊字符都会发挥作用。
例:
mykey:
str1: aaa \n bbb
str2: 'aaa \n bbb'
str3: "aaa \n bbb"
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
*/
原始写法
student:
id: 1
name: zhangsan
age: 18
行内写法
student: {id: 1, name: zhangsan, age: 18}
读取配置的对象:
首先要把 Student
类定义出来,给这个类添加 @Component
注解,存到 Spring 中,添加 @ConfigurationProperties(prefix = "student")
注解,表示将配置文件中的 student
配置赋值给当前的对象(为了完成这一步,一定要添加 Setter 方法)。
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;
}
}
接下来我们去获取这个对象,这里采取属性注入的方式:
@RestController
public class TestController {
@Autowired
private Student student;
@RequestMapping("/hi")
public String hi() {
return student.getName() + " age: " + student.getAge();
}
}
结果:
注意事项:
原始写法
mylist:
dbtype:
- mysql
- sqlserver
- db2
行内写法
mylist: {dbtype: [mysql, sqlserver, db2]}
例:
首先定义 MyList 类,这次我们使用 lombok 中的 @Data 注解来自动生成 Getter 和 Setter 方法。
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;
}
获取并读取:
@RestController
public class TestController {
@Autowired
private MyList myList;
@RequestMapping("/hi")
public String hi() {
return "size: " + myList.getDbtype().size() + " get(0): " + myList.getDbtype().get(0);
}
}
结果:
创建 application-{profile}.yml
格式的配置文件,其中,{profile}
是指激活的环境配置文件的名称。例如,application-dev.yml
将用于开发环境,而 application-prod.yml
将用于生产环境。
在 application.properties
或 application.yml
中设置 spring.profiles.active
属性来指定激活的环境。例如:
# application.properties
spring.profiles.active=dev
或者
# application.yml
spring:
profiles:
active: dev
这将使 Spring Boot 使用 application-dev.yml
中的配置。
Spring Boot 项目在启动时就有日志输出:
例:
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;
}
}
结果:
#日志保存名称
logging:
file:
name: springboot.log
启动项目即可在项目根目录下面找到 springboot.log 文件,打开就能看到日志
特别注意:
也可以设置日志的路径:
logging:
file:
name: D:\Test\
启动项目,可以看到这个路径下自动生成了一个 spring.log 文件
通过调用日志对象的不同方法输出不同级别的日志信息
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");
日志级别(从低到高)
fatal 没有相应的方法来主动打印出来,fatal 级别的日志只有在程序发生严重错误的时候自动打印。
在之前的操作中,我们没有见过 debug 日志和 trace 日志,因为默认的日志级别是 info,trace 和 debug 日志都被筛选掉了。
在配置文件中设置 logging.level 配置项来筛选日志,输出指定日志级别以及比它级别高的日志信息,屏蔽比它级别低的日志。
logging.level.root 表示根日志,可以理解为所有的日志,默认值为 info。
如下配置,程序只会输出 debug 及级别更高的日志信息
logging:
level:
root: debug
更精细化的设置:
logging:
level:
root: warn
com:
example:
demo: debug
以上配置表示,将日志输出的最低级别设置成 warn,而 com.example.demo 下的日志最低级别设置为 debug
每个类都要 LoggerFactory.getLogger(xxx.class);
来获取日志对象太麻烦了,使用 lombok 可以实现更简单的输出。
使用 @Slf4j
注解,会自动给你提供一个名为 log 的日志对象
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;
}
}
基本注解
注解 | 作用 |
---|---|
@Getter | 自动添加 Getter 方法 |
@Setter | 自动添加 Setter 方法 |
@ToString | 自动添加 toString 方法 |
@EqualsAndHashCode | 自动添加 equals 和 hashCode 方法 |
@NoArgsConstructor | 自动添加无参构造方法 |
@AllArgsConstructor | 自动添加全属性构造方法,顺序按照属性定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | 自动添加必需属性的构造方法 |
组合注解
注解 | 作用 |
---|---|
@Data | 等效于 @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode |
日志注解
注解 | 作用 |
---|---|
@Slf4j | 添加一个名为 log 的日志对象 |