一.SpringBoot
1.介绍SpringBoot
Spring 的诞生是为了简化 Java 程序的开发的,而 Spring Boot 的诞生是为了简化 Spring 程序开发
的。
Spring Boot 就是 Spring 框架的脚手架,它就是为了快速开发 Spring 框架而诞生的。
2.SpringBoot优点
快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于秒级集成各种框架。
内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序。
快速部署项目,无需外部容器即可启动并运行项目。
可以完全抛弃繁琐的 XML,使用注解和配置的方式运行开发。
支持更多的监控的指标,可以更好的了解项目的运行情况。
二.创建SpringBoot工程
选择 SpringBoot2的版本,加入Lombok和SpringWeb依赖
SpringBoot项目启动器
简单的一个程序
package com.javastudy.springboot3.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Chooker
* @create 2023-07-23 17:16
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello,SpringBoot";
}
}
输入:http://127.0.0.1:8080/hello 即可访问
约定大于配置
在Spring项目中我们需要配置扫描路径,但在SpringBoot项目中,有默认的包扫描路径,为SpringBoot启动类的所在的路径及其子路径
三.SpringBoot的配置文件
有两种类型的配置文件,同时存在都生效
1.properties配置文件
1.properties配置文件格式
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
2.取配置文件的信息
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使⽤“${}”的格式读取
@Component
public class ReadYml {
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("Read YML,port:" + port);
}
}
3.properties配置文件的优缺点
从上述配置key看出,properties 配置文件中会有很多的冗余的信息,会对带宽有影响
2.yml配置文件
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语
言”。
1.yml配置文件格式
server:
port: 8080
spring:
#当前的阶段,dev是开发阶段,test是测试阶段,prod是发布阶段
profiles:
active: dev
datasource:
url: jdbc:mysql://localhost:13306/blog_db?characterEncoding=utf8&useSSL=false
username: root
password: woaini520
每一层要在左对齐,并且冒号后面一定要于要有空格
2.取配置文件的信息
和上面的一样
注意:如果没有设置好编码的格式,可能yml文件的中文注解会出现乱码的现象,而且是不可逆的
因此当打开或者创建一个spring项目的时候,我们首先要设置好File Encodings(如下图所示)
3.yml配置文件的优缺点
- yml是一个可读性高,写法简单,易于理解,他的语法和JSON语言类似
- yml支持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
- yml支持更多的编程语言,它不止是Java中可以使用在Golang、PHP、Python、Ruby、JavaScript、Perl中。
3.yml配置文件配置不同数据类型
1.配置不同数据类型及 null
# 字符串
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: ~
单双引号的区别
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
打印的结果
从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据。
- 双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
2.配置对象
student:
id: 1
name: Java
age: 18
或者是行内写法
student: {id: 1,name: Java,age: 18}
这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解
@ConfigurationProperties 来读取,具体实现如下
@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
private Integer id;
private String name;
private Integer age;
}
@Component
@Slf4j
public class ReadYml2 {
@Autowired
private Student student;
@PostConstruct
public void postConstruct() {
log.info(student.toString());
}
}
3.配置list集合
dbtypes:
name:
- mysql
- sqlserver
- db2
或者是行内写法
dbtypes: {name: [mysql,sqlserver,db2]}
4.配置map集合
map2:
key1: value1
key2: value2
key3: value3
4.多平台配置文件
在不同的阶段,配置文件的内容不一样,比如一个软件的开发通常包括:开发,测试,预发布和发布阶段,每一个阶段不同的人员参与研发,他们的数据库等一些的信息可能不同,因此我们就需要不同的配置文件来对应不同阶段的配置文件的信息
在application.yml文件中配置当前的环境(此时配置的就是开发环境,默认读取application-dev.yml)
spring:
#当前的阶段,dev是开发阶段,test是测试阶段,prod是发布阶段
profiles:
active: dev
注意:如果同时两种类型的配置文件同时存在,都生效,如果这两个文件有冲突项,以properties文件为主,通常只存在一种.
四.SpringBoot的日志
SpringBoot中内置了日志框架,在启动springboot项目的时候可以看到有如下格式的打印的日志信息
1.常见日志框架
日志门面可以类比为JDBC,日志实现可以类比为mysql,oracle等数据库通过slf4j或者commons-logging可以调用日志,从而完成日志功能
2.自定义日志
我们可以通过private Logger logger = LoggerFactory.getLogger(LogController.class)来获取日志对象,从而来打印日志信息
package com.javastudy.springboot3.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/**
* @author Chooker
* @create 2023-07-24 12:32
*/
@RestController
public class LogController {
private Logger logger = LoggerFactory.getLogger(LogController.class);
@PostConstruct
public void postConstruct(){
logger.info("第一条日志信息");
}
}
3.日志的级别
1.日志的级别
日志级别为:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认日志级别);
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。(不提供方法,系统挂了自动打印)
@PostConstruct
public void postConstruct(){
logger.trace("trace日志信息....");
logger.debug("debug...");
logger.info("info...");
logger.warn("warn....");
logger.error("error...");
}
**打印的日志信息: **
可以观察到上面两个日志信息没有打印出来,为什么会这样呢?接下来日志级别来说明
2.日志级别的顺序
日志级别的顺序:
SpringBoot的默认日志级别为info,低于info级别的信息不打印
我们可以通过配置文件对日志级别进行修改
logging:
level:
root: warn
可以观察到只打印了warn和error级别的日志信息
3.分目录打印
设置其他目录打印的级别为info,com.javastudy.springboot3.controller目录下面的信息打印的默认日志级别为debug
logging:
level:
root: info
com:
javastudy:
springboot3:
controller: debug
4.日志持久化
以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
1.配置日志保存的地址
logging:
file:
path: D:\java cave\Loggings
日志文件信息:两次不同的时间点启动springboot程序,可以看到两次日志的信息(是追加添加的)
2.配置分割日志
日志超过1KB就进行分割,分割后日志的名字为 file-name-pattern的形式
logging:
file:
path: D:\java cave\Loggings\
level:
root: info
com:
javastudy:
springboot3:
controller: debug
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
3.配置日志文件的文件名
# 设置⽇志⽂件的⽂件名
logging:
file:
name: springboot.log
文件默认保存当当前目录的下面
可以这样设置进行保存到特定的目录下面
logging:
file:
name: D:\java cave\Loggings\springboot.log
5.Lombok结合日志
添加lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
在需要日志信息输出的类上面加@Slf4j注解,即可直接使用log对象
package com.javastudy.springboot3.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/**
* @author Chooker
* @create 2023-07-24 12:32
*/
@RestController
@Slf4j
public class LogController2 {
@PostConstruct
public void postConstruct(){
log.trace("trace日志信息....");
log.debug("debug...");
log.info("info...");
log.warn("warn....");
log.error("error...");
}
}
观察.class文件我们可以知道底层原理其实就是和之前是一样的
Java程序运行原理
Lombok 的作用如下图所示:
6.Lombok其他用处
1.基本注解
注解作用@Getter自动添加 getter 方法
@Setter自动添加 setter 方法@ToString自动添加 toString 方法@EqualsAndHashCode自动添加 equals 和 hashCode 方法@NoArgsConstructor自动添加无参构造方法@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序@NonNull属性不能为 null@RequiredArgsConstructor自动添加必需属性的构造方法,final +@NonNull 的属性为必需
@Getter和@Setter注解加在属性上面,给特定的属性加getter和setter方法,加在类上面给所有的属性加getter和setter方法
2.组合注解
注解作用@Data@Getter + @Setter + @ToString +
@EqualsAndHashCode +
@RequiredArgsConstructor +
@NoArgsConstructor
3.日志注解
注解作用
@Slf4j
添加一个名为 log 的日志,使用 slf4j
版权归原作者 允歆辰丶 所有, 如有侵权,请联系我们删除。