什么是Spring Boot
Spring 为了简化 Java 程序,而Spring Boot为了简化 Spring 程序。
Spring Boot的优点
● 快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。
● 内置运行容器,⽆需配置 Tomcat 等 Web 容器,直接运行和部署程序。
● 快速部署项⽬,无需外部容器即可启动并运行项⽬。
● 可以完全抛弃繁琐的 XML,使⽤注解和配置的方式进行开发。
● ⽀持更多的监控的指标,可以更好的了解项目的运行情况。
创建Spring Boot项目
安装 Spring Boot Helper 插件。安装好之后,它的名字就变成了 Spring Initializr and Assistant。
Spring Boot项目的目录:
运行SpringBoot项目
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello,SpringBoot";
}
}
注意:把bean交给Spring Boot管理需要配置扫描路径,SpringBoot有默认的扫描路径,就是当前启动类的路径,即就是com.examle.demo及其子路径。这就是Spring Boot的约定大于配置。
Spring Boot的配置文件
我们知道Servlet项目是通过Content path来区分项目的,而在Spring项目中,则是通过端口号来区分项目,如果tomcat下部署了多个项目,分别使用不同的端口号来启动不同的项目。对于Spring项目而言,tomcat内嵌到Spring项目中,一个tomcat进归一个Spring项目,而一个服务器可以通过启动多个tomcat来部署多个项目。那端口号在哪里设置呢?就是在配置文件中。
比如,将上面示例中的端口号从8080改为9090:
配置文件的作用
整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:
- 数据库的连接信息(包含⽤户名和密码的设置);
- 项⽬的启动端⼝;
- 第三方系统的调⽤秘钥等信息;
- ⽤于发现和定位问题的普通⽇志和异常⽇志等。
想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以用于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的。
配置文件的格式
Spring Boot 配置⽂件主要有以下两种:
- application.properties
- application.yml
理论上properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在⼀个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最⾼,但加载完 .properties 文件之后,也会加载 .yml ⽂件的配置信息。
虽然理论上 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置文件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰⼀样,不管是⽼款的服装还是新款的服装,⼀定要统⼀了才好看。
properties 配置文件说明
properties的基本语法
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的。其中Key是一个字符串,多个单词用 .
分隔。如:
#服务端口号
server.port=9090
#数据库配置信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
读取配置文件
Spring Boot的的配置文件中有Spring的相关配置,还有自定义配置。如果在项目中想要主动的读取配置⽂件中的内容,可以使用 @Value 注解来实现。@Value 注解使⽤“${}”的格式读取,如下代码所示:
@RestController
public class ValueController {
@Value("${mykey.key1}")
private String key1;
@PostConstruct
public void postConstruct(){
System.out.println("==================");
System.out.println("key1:" + key1);
}
}
打印的结果:
注意,如果不加${},会直接把双引号里的值赋给key1变量。
properties的缺点
properties 配置是以 key-value 的形式配置的,从配置key看出,properties 配置文件中会有很多的冗余的信息。
yml 配置文件说明
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔”。
基本语法
yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使用英⽂冒号加空格的方式组成的,其中的空格不可省略。
yml 连接数据库
配置文件:
#连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
username: root
password: root
读取配置文件
ym读取配置文件的方式和properties一样,通过@Value 注解使⽤“${}”的格式读取。
@RestController
public class ValueController {
@Value("${spring.datasource.username}")
private String sqlusername;
@PostConstruct
public void postConstruct(){
System.out.println("==================");
System.out.println("sqlusername:" + sqlusername);
}
}
运行结果:
yml进阶
yml 配置不同数据类型及 null
配置文件:
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
结果:
value 值加单双引号
配置文件:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
运行结果:
从上述结果可以看出:
字符串默认不⽤加上单引号或者双引号。
单引号不会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据。
双引号会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思。
配置对象
定义学生类:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
这里使用lombok里的@Data注解相当于写了getter、setter方法、toString方法和一些构造函数。@Component是把这个对象交给Spring来管理。此时不能⽤ @Value 来读取配置中的对象,需要使用另⼀个注解@ConfigurationProperties 来读取,并指定配置文件的值。这里的prefix可以省略。
配置文件:
student:
id: 1
name: Java
age: 18
配置集合和map
配置文件:
student:
id: 1
name: Java
age: 18
dbtypes:
- mysql
- sqlserver
- db2
map2:
k1: kk1
k2: kk2
k3: kk3
Student类:
@ConfigurationProperties("student")
@Component
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private List<String> dbtypes;
private HashMap<String,String> map2;
}
打印结果:
设置banner
自定义banner文件,让SpringBoot项目在启动时打印banner文件里的内容。
多平台配置文件的设置
实际开发中,开发环境,测试环境,以及发布环境的配置是不一样的。可以针对㒺环境设置不同的配置。
先写各个平台的配置文件:
开发环境的配置文件:application-dev.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
username: root
password: 123456
测试环境的配置文件:application-test.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
username: root
password: 112233
发布环境的配置文件:application-prod.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
username: root
password: root123456
为了拿到不同环境下数据库的密码,首先需要在主配置文件application.yml
中删除原来的数据库配置,然后添加如下配置:
spring:
profiles:
active: dev
其中active后面跟的是环境名称,比如dev/test/prod。
运行结果:
yml的优点
(1)yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
(2)yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和大量依赖外观的特⾊,特别适合用来表达或编辑数据结构、各种配置文件等。
(3)yml 支持更多的编程语⾔,它不止是 Java 中可以使用在 Golang、PHP、Python、JavaScript、Perl 中。
Spring Boot的日志文件
Spring Boot项目在启动时有默认的日志输出。日志的作用就是为了发现和定位问题。
通过上述日志信息我们能发现以下 几个问题:
①默认情况下,输出的日志并非是开发者定义和打印的,开发者如何在程序中自定义打印日志?
②⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,也就是不能持久化。如何把⽇志永久的保存下来?
自定义日志
开发者⾃定义打印⽇志的实现步骤:
- 获取日志对象
- 打印日志内容
获取日志对象
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:
//1.获取日志对象
private Logger logger = LoggerFactory.getLogger(LogController.class);
日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类。因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调⽤ slf4j 来输出日志。Logger 对象是属于 org.slf4j 包下。
日志框架
这里的日志门面和日志实现的关系相当于JDBC和MySql、Sql Server之间的关系。SpringBoot默认使用的是logback。
打印内容
@Controller
public class LogController {
//1.获取日志对象
private Logger logger = LoggerFactory.getLogger(LogController.class);
@PostConstruct
public void postConstruct(){
//打印日志
logger.info("第一条日志信息");
}
}
打印结果:
日志级别
日志打印过多会不利于排查问题,而打印过少会影响系统性能。将日志级别划分为以下6种:
trace:微量,少许的意思,级别最低;
debug:需要调试时候的关键信息打印;
info:普通的打印信息(默认日志级别);
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的,因为代码异常导致程序退出执行的事件。
Spring Boot项目默认的日志级别是info,低于info级别的日志不打印,高于info级别的打印。
设置日志级别
日志级别配置只需要在配置文件中设置“logging.level”配置项即可。如下所示:
logging:
level:
root: info
当配置为info级别时,只会打印info级别以及比info级别高的日志。
分目录设置日志级别
当日志级别设置为debug时,可以看到系统的日志信息,但我们只想看到自己程序的debug日志,此时需要分目录设置日志级别。
logging:
level:
root: warn
com:
example:
demo: debug
上述配置就是整体要打印warn级别的日志,然后在com.example.demo目录下打印debug级别的日志。
日志的持久化
以上的日志都是输出在控制台上的,然⽽在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的日志写到相应的⽬录或⽂件下。
配置日志文件的保存路径:
logging:
file:
path: D:\test\log
配置日志文件的文件名:
logging:
file:
name: D:\test\log\springboot.log
日志文件是追加的形式。这种情况可能会导致日志文件越来越大。默认最大的日志大小为10MB。
可以自定义配置日志的大小,当超出设置值时会自动分割。
logging:
logback:
rollingpolicy:
max-file-size: 1KB
lombok日志输出
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦。可以使用lombok 来更简单的输出日志。
1.添加 lombok 框架支持。
2.使用 @Slf4j注解输出日志。
添加lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
使用@Slf4j输出日志
@Slf4j
@Controller
public class LogController2 {
@PostConstruct
public void postConstruct(){
log.trace("trace日志信息");
log.debug("debug日志信息");
log.info("info日志信息");
log.warn("warn日志信息");
log.error("error日志信息");
}
}
打印结果:
lombok原理
在上述示例中,查看编译后的class文件可以看到,文件中没有@Slf4j注解了,相对的多出了一行log对象的定义。
lombok的注解
基本注解
注解 | 作用 |
---|---|
@Getter | ⾃动添加 getter 方法 |
@Setter | ⾃动添加 setter 方法 |
@ToString | ⾃动添加 toString 方法 |
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode 方法 |
@NoArgsConstructor | ⾃动添加⽆参构造方法 |
@AllArgsConstructor | ⾃动添加全属性构造方法,顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造方法,final + @NonNull 的属性为必需 |
@Getter和@Setter可以添加到类上,也可以添加到属性上。这两个注解可以单独使用。类注解就表示所有的属性都具备了对应注解的方法。如果注解加在了属性了,那当前属性就具备了对应注解的方法。
组合注解
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor |
日志注解
注解 | 作用 |
---|---|
@Slf4j | 添加⼀个名为 log 的日志,使用 slf4j |
继续加油~