文章目录
SpringBoot
springboot帮助开发者简单、快速地创建一个独立的、生产级别的spring应用。大部分秩序编写少量配置即可快速整合spring平台及第三方技术;
特性
- 快速创建独立应用;
SSM:导包、配置、运行 - 直接嵌入Tomcat、jetty or undertow(无需部署war包),直接jar包即可;
- 提供可选
starter
,简化应用整合;
场景启动器(starter)
导包一堆,控制版本
为每种场景准备对应依赖
- 按需自动配置Spring及三方库;
若要使用场景(生效),则自动配置对应内容
约定大于配置,每个场景有各自默认配置
支持自定义配置文件
- 提供监控指标、健康检查、外部化配置等生产级特性;
- 无代码生成、无xml;
示例
pom.xml
中添加<parent>
<dependency>
;
<!--所有springboot项目都必须继承自spring-boot-starter-parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
</parent>
<dependencies>
<!--web开发启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 主程序
@SpringBootApplication//标志为springboot应用
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(mainApplication.class, args);
}
}
- 业务
//@ResponseBody和@Controller组合
//每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中
@RestController
public class Controller {
//用于类和方法上,用于定义HTTP GET请求的URL路径。
//当客户端发送HTTP GET请求时,
//Spring Boot会自动将请求映射到具有相应URL路径的控制器方法上。
@GetMapping("/Hello")
public String hello() {
return "Hello There";
}
}
- 测试
- 打包
maven clean package
将项目达成可执行的jar包
java -jar demo.jar
启动项目
先导入
<!--springboot打包应用-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
总结
简化整合
导入相关场景:
官方命名:
spring-boot-starter-*
第三方命名:*-spring-boot-starter
简化开发
无需编写配置,直接开发业务
简化配置
在resources.application.properties
进行集中式管理配置
简化部署
打包为可执行 jar 包,使得环境中只需有java环境即可
简化运维
运行时修改配置,只需在外部启用一个application.properties文件,监控、健康检查等
Spring Initializer创建向导
快速创建项目及结构
应用分析
依赖管理机制
- maven依赖传递,A-B-C,拥有A则拥有B、C
- boot项目拥有父项目
spring-boot-starter-parent
,其也拥有父项目spring-boot-dependencies
,这个项目中声明了所有常见 jar 依赖的版本号。若要自定义则在pom.xml
中就近声明
- 第三方库的 jar 包需要自行声明版本号
自动配置机制
初步理解
- 自动配置的Tomcat、SpringMVC等
- 默认的包扫描规则:
默认扫描主程序所在的包(com.*.boot
)及其下的子包,代替component-scan
功能;
自定义扫描路径:
@SpringBootApplication(scanBasePackages = "com.*")
or
@ComponentScan("com.*")
- 配置默认值
配置文件的所有配置项都适合特定属性类对象值一一绑定的,如Tomcat服务器有关配置—ServerProperties
,文件上传有关配置—MultipartProperties
; - 按需记载自动配置
场景启动器会首先导入spring-boot-starter
作为核心,其是所有starter
的starter
;
核心也会导入一个spring-boot-autoconfigure
,其中为各种场景的自动配置类;
完整流程
- 导入
starter-web
,引入web开发厂场景
- 场景启动器导入相关所有依赖:
starter-json
starter-tomcat
springmvc
;- 每个启动器都引入
spring-boot-starter
的核心启动器;- 核心启动器引入
spring-boot-autoconfigure
包;spring-boot-autoconfigure
囊括所有场景的所有配置;- SpringBoot默认扫描不到
spring-boot-autoconfigure
下写好的所有配置类(已做整合操作),默认只扫描主程序所在包;
- 主程序
SpringBootApplication
@SpringBootApplication
由三个注解组成:@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
;@EnableAutoConfiguration
:SpringBoot开启自动配置的核心
- 由
@Import(AutoConfigurationImportSelector.class)
提供功能:向容器中批量导入组件;- SpringBoot默认加载142个配置类;
- 该142个配置类是由
spring-boot-autoconfigure
下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import
文件指定;- 项目启动的时候利用
@Import
批量导入组件机制,把autoconfigure
包下的142个*AutoConfiguration
类导入进来(自动配置类);
- 按需生效:不是每个自动配置类都能生效,只有条件注解
@ConditionalOn*
成立,才能生效;
*AutoConfiguration
自动配置类
- 给容器中使用@Bean放一堆组件;
- 每个自动配置类都有可能有
@EnableConfigurationProperties(ServerProperties.class)
,用来将配置文件中配的指定前缀的属性值封装到*Properties
属性类中;- 以Tomcat为例,服务器所有配置都已
server
开头,配置都封装到了特定属性类中;- 容器中所有组件的一些核心参数,都源于
*Properties
,*Properties
都是和配置文件绑定的;- 只需要修改配置文件,核心组件的底层参数就能被修改;
- 业务阶段,无需关心底层整合
效果:导入starter
,修改配置文件,就能修改底层行为
SpringBoot学习点
- 理解自动配置原理
a.导入starter
--> 生效*AutoConfiguration
--> 组件 -->*properties
--> 配置文件 - 理解其他框架底层.
- 能够定制化任何组件
初级开发:导入、Controller、Service、Mapper、少量修改配置文件
高级开发:自定义组件、自定义配置、自定义starter
核心技能
常用注解
SpringBoot采用全注解方式驱动
- 组件注册
常用组件 | 作用 |
---|---|
@Configuration | 将类注册为配置类,其本身也是容器中的组件 |
@SpringBootConfiguration | 同上,但特别指SpringBoot中的配置类 |
@Bean | 在容器中注册组件,名称默认为方法名的小驼峰形式,也可以直接("*") 修改注解的值 |
@Scope | 组件默认为单实例,通过("prototype") 修改为多例 |
@Import | 导入第三方组件 |
@ComponentScan | 修改默认扫描包路径 |
- 条件注解
@ConditionalOnXxx
:若注解指定的条件成立,则触发后续指定行为
常见条件注解 | 条件 |
---|---|
@ConditionalOnClass | 若类路径中存在这个类(@ConditionalOnClass(value="com.*.*.*" ),则触发后续行为 |
@ConditionalOnMissingClass | 若类路径中不存在这个类,则触发后续行为 |
@ConditionalOnBean | 若类路径中存在这个类(@ConditionalOnBean(value="****.class" ),则触发后续行为 |
@ConditionalOnMissingBean | 若类路径中不存在这个类,则触发后续行为 |
- 属性绑定
将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定
@ConfigurationProperties
:给容器中注册组件(@Component、@Bean)
使用此标签声明组件和配置文件的哪些前缀进行绑定
@ConfigurationProperties(perfix = "(配置文件中的定义)")
@ EnableConfigurationProperties
开启指定组件的属性绑定
默认会把该组件自动放入容器中
- 快速注册注解,主要用于导入第三方包中的注解。因为SpringBoot默认扫描路径不同,即使组件上标注了
@Component``@ConfigurationProperties
注解,也无法发挥作用
YAML配置文件
用以解决SpringBoot集中化管理的application.properties
文件,配置过多后难以阅读和修改,层级结构辨识度不高的问题;其设计目标是方便读写、层次分明,以.yaml
或.yml
作为后缀名
基本语法
- 大小写敏感
- 使用缩进标识层级关系,
k: v
,中间用空格分割 - 缩进时不适用Tab,只允许空格执行
- 缩进的空格数量不重要,只要求相同层级元素左侧对其
#
表示此行从该符号起成为注释- 支持写法:
- 对象:键值对的集合,如:映射O(map)/哈希(hash)/字典(dictionary)
- 数组:一组按次序排列的值,如:序列(sequence)/列表(list))
- 纯量:单个的、不可再分的值,如:字符串、数字、布尔、日期
示例
application.properties
person.name=Max
person.age=18
person.birthDay=2006/3/5
person.like=true
person.friend.name=Chloe
person.friend.age=19
person.friend.birthDay=2005/1/3
person.doe[0].name=cake
person.dog[0].age=3
person.doe[1].name=cookie
person.dog[1].age=2
person.cats.c1.name=candy
person.cats.c1.age=1
person.cats.c2.name=snack
person.cats.c2.age=3
application.yml
person:
name: Max
age: 18
birth-day: 2006/3/5
like: true
friend:
name: Chloe
age: 19
birth-day: 2005/1/3
dogs:
-name: cake
age: 3
-name: cookie
age:2
cats:
c1:
name: candy
age: 1
c2: {name: snack,age: 3}
辅助工具lombok
- 引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
- 置于类前
注解 | 作用 |
---|---|
@Date | 自动生成JavaBean属性的getter/setter 方法 |
@NoArgsConstructor | 自动生成无参构造 |
@AllArgsConstructor | 自动生成全参构造 |
- 细节
birthDay
推荐为birth-day
,驼峰换为短横线连接;- 文本中单引号不会转义字符,双引号会转义字符;
- 长文本存放时,使用
|
会保留原本信息,>
会将换行符替换为空格;---
三个下划线标识下列文本为同一部分,可收缩至一处;
日志配置
- 项目中应用日志记录信息,而非
System.out.println()
- 应选择一个日志门面作为接口,一个日志实现作为实现
日志门面 | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
简介
- Spring使用
commons-logging
作为内部日志,但底层实现是开放可对接其他日志框架的 - SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件
logback
默认使用- SpringBoot默认配置流程:
- 每个场景启动器导入的核心启动器,都会引入日志功能
spring-boot-starter-logging
- 默认使用
logback + slf4j
组合作为底层日志- 日志在系统启动时开始使用,
*AutoConfiguration
是系统启动结束后才放置的组件- 日志是利用
ApplicationListener
监听器机制实现配置- 所有日志配置都可通过
logging
开头的配置文件修改
格式组成
- 时间日期:毫秒级
- 日志级别:
FATAL
,ERROR
,WARN
,INFO
,DEBUG
,TRACE
(logback
没有FATAL
)- 进程ID
- —:消息分割符
- 线程名:使用
[ ]
包含- Logger名:常为产生日志的类名
- 消息:日志记录的内容
记录日志
Loggoer logger = LoggerFactory.getLogger(getClass());
或用@Slf4j进行注解
@Slf4j
@RestController
public class Controller {
@GetMaaping("/h")
public string hello() {
log.info("hello world");
return "hello wordl";
}
}
日志级别
- 只会打印指定级别以上的日志
- 不指定级别的所有类,都使用
root
指定的级别作为默认 - SpringBoot日志默认级别是
INFO
- 操作:
application.properties/yml
中配置logging.level.<logger-name> = <level>
指定级别level
范围:TRACE, DEBUG, INFO, WARN, ERRO, FATAL, OFF
,定义在LogLevel
类中root
的logger-name
为root
,可通过配置logging-level-root = *
来配置所有未指定类的日志级别
日志分组
将相关logger
分在同组,统一配置
eg.Tomcat
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace
SpringBoot已预定义两个分组
web | org.springframework.core.codec , org.springframework.http , org.springframework.web , org.springframework.boot.actuate.endpoint.web , org.springframework.boot.web.servlet.ServletContextInitializerBeans |
---|---|
sql | org.springframework..jdbc.core , org.hibemate.SQL , org.jooq.tools.LoggerListener |
文件输出
logging.file.name | logging.file.path | 示例 | 效果 |
---|---|---|---|
未指定 | 未指定 | null | 金控制台输出 |
指定 | 未指定 | my.log | 写入指定文件,可同时指定路径 |
未指定 | 指定 | /var/log | 写入指定目录,默认为spring.log |
指定 | 指定 | my.log /var/log | 忽略path ,以name 为准 |
文件归档与滚动切割
- 归档:指定时间段的日志文件单独存入一个文档
- 切割:超过指定大小的文件切割到新文件中
- 若未指定,仍使用SpringBoot默认
logback
日志,则可通过application.properties/yaml
文件指定日志滚动规则 - 其它日志系统需要自行配置
xml
文件 - 滚动设置规则:
配置项 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-patter | 日志存档的文件名格式(默认值:${LOF_FILE}.%d{yyyy-MM-dd}.%i.gz ) |
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清楚过往存档(默认值:false ) |
logging.logback.rollingpolicy.max-file-size | 文件切割最大大小(默认:10MB) |
logging.logback.rollingpolicy.total-size-cap | 日志总量容纳最大值,超出后删除旧日志文件(默认值:0B) |
logging.logback.rollingpolicy.max-history | 日志文件保存最大天数(默认值:7) |
自定义
- 若自行配置
xml
或groovy
文件,推荐使用-spring
变量(例如Log4j2-spring.xml
而非Log4j2.xml
),便于Spring完全控制日志初始化 - 可自由组合不同框架和不同格式配置文件