文章目录
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-jsonstarter-tomcatspringmvc;- 每个启动器都引入
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完全控制日志初始化 - 可自由组合不同框架和不同格式配置文件
本文详细介绍了SpringBoot框架如何通过简化配置、依赖管理和自动配置,加速应用程序的开发、部署和运维。涵盖了SpringInitializer创建向导、常用注解、YAML配置、lombok辅助工具以及日志配置的最佳实践。
1547

被折叠的 条评论
为什么被折叠?



