目录
1. SpringBoot 概述
1.1. 为什么会有springboot
1.1.1. 传统Spring 的两个缺点
1.1.2. Springboot 功能
2. SpringBoot 快速搭建
2.1. 创建Maven项目编辑编辑编辑
2.2. 导入SpringBoot起步依赖
2.3. 定义controller
2.4. 添加引导类
2.5. 启动访问
3. SpringBoot 起步依赖原理分析
3.1. 什么是Maven BOM项目
3.2. spring-boot-starter-parent 版本控制
3.3. 自己项目引入依赖的例子spring-boot-starter-web
4. SpringBoot配置
4.1. 配置文件为什么选择使用YML而不是XML
4.2 YML基本语法
4.3. YML数据格式
4.3.1. 对象(map): 键值对的集合
4.3.2. 对象数组
4.3.3. 纯量(单个的,不可再分的值)
4.4. 读取YML配置方式
4.5. SpringBoot profile
4.5.1. Profile 配置方式
4.5.2. profile激活方式
5. SpringBoot 配置加载
1. SpringBoot 概述
Spring Boot提供了一种快速使用Spring的方式,基于约定由于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
2014年4月,Spring Boot 1.0.0 发布。Spring的顶级项目之一(Spring | Projects)。
顶级项目是什么意思?
在Spring的语境中,顶级项目是指与Spring框架具有同等地位或重要性的项目。这些项目通常是在Spring社区中广泛认可、使用率高、功能强大且对Spring生态系统有重要贡献的。
1.1. 为什么会有springboot
1.1.1. 传统Spring 的两个缺点
- 配置文件麻烦不好记.配置繁琐.浪费很多时间。
- 依赖繁琐,容易出错。引用不同的jar包兼容性配置麻烦。
1.1.2. Springboot 功能
- 自动配置
传统的基于Spring的应用程序开发需要广泛的配置和许多复杂的组件和库来实现某些功能。这导致开发过程变得复杂且耗时。Spring Boot的目标就是消除这种困难和不便,它提供了一系列的约定和默认设置,使得开发人员能够更快地开发Spring应用程序。Spring Boot的设计目标之一就是能够快速地进行应用开发。 - 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM), 定义了对其他库的依赖传递。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
-
辅助功能
Spring Boot内置了多种常用的服务器,如Tomcat、Jetty、Undertow等。这使得应用可以打包成一个可执行的JAR文件,并且可以直接运行,无需额外部署服务器。这进一步简化了应用的部署和管理过程。
Spring Boot提供了健康检查功能(http://localhost:8080/actuator/health),可以通过HTTP或JMX等方式查看应用的运行状态和性能指标。这方便了运维人员进行监控和管理,确保应用的稳定性和可用性。
随着微服务架构的流行,越来越多的应用被拆分成多个小的、独立的服务。Spring Boot对微服务架构提供了良好的支持,它使得开发人员可以轻松地构建、部署和管理微服务应用。
2. SpringBoot 快速搭建
2.1. 创建Maven项目
2.2. 导入SpringBoot起步依赖
- Spring-boot-starter-parent
- Spring-boot-starter-web
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.springstudy</groupId>
<artifactId>springboot-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<!--springboot 工程需要继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<dependencies>
<!--web 开发起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2.3. 定义controller
package com.mycompany.springstudy.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("/helloUser")
public String helloUser(){
return "Hello, Good day user!";
}
}
2.4. 添加引导类
引导类也就是springboot项目的入口。
1. @SpringBootApplication
2. main 方法中加 SpringApplication.run(*.class)
package com.mycompany.springstudy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
2.5. 启动访问
总结:
- SpringBoot在创建项目时,使用jar的打包方式
- SpringBoot的引导类, 是项目入口,运行main方法就可以启动项目.
- 使用SpringBoot和Spring构建的项目,业务代码编写完全一样.
- 如上是手动创建,当然我们也可以使用Spring提供的快速搭建方式。网站Spring Initializr.
3. SpringBoot 起步依赖原理分析
<!--springboot 工程需要继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<dependencies>
<!--web 开发起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.1. 什么是Maven BOM项目
我们引用的springboot parent <artifactId>spring-boot-starter-parent</artifactId> 是一个Maven BOM(Bill of Materials)项目。
BOM是指一个特殊的POM(Project Object Model)文件,该文件主要用于依赖管理,而不是直接包含项目代码或构建配置。
通过引入Maven BOM作为项目的依赖,你可以确保一组依赖项的版本在多个项目中保持一致,而无需在每个项目的POM文件中单独指定这些依赖项的版本。这有助于减少版本冲突,简化依赖管理,并提高项目的可维护性。BOM项目的标识是 pom文件中配置了 <packaging>pom</packaging>。而packaging的默认类型是jar,也就是maven打包时会打成jar包,当然也可以配置为war
BOM项目通常有以下几种用途
- 依赖管理:这种类型的项目通常被称为“BOM”(Bill of Materials)项目,它主要用于管理和定义一组依赖项及其版本。通过这种方式,其他Maven项目可以引入这个POM作为依赖,从而继承其定义的依赖项和版本,而无需在每个项目中单独定义。如我们这里的<artifactId>spring-boot-starter-parent</artifactId>
- 多模块项目:在大型项目中,你可能会有多个模块,每个模块都有自己的POM文件。这些模块通常会有一个父POM文件,该文件使用<packaging>pom</packaging>指定其类型为POM。父POM文件用于管理子模块的公共配置,如依赖项、插件配置、属性等。子模块通过<parent>元素引用父POM。
如下我们用idea定义一个多模块项目,父项目的pom包类型就为po
3.2. spring-boot-starter-parent 版本控制
在spring的生态中,大多的项目都存在版本兼容问题,如spring cloud和spring boot的兼容如下。
我们知道spring融合的插件项目等那么多。那么他们的版本管理如果是让程序员自己去维护,对于每次项目升级,那将对程序员是一个耗时的过程。spring-boot-starter-parent 做的就是规范这件事。
我们打开spring-boot-starter-parent项目,可以发现它继续引用了<artifactId>spring-boot-dependencies</artifactId> 这个BOM项目,而它自身并没有做什么依赖版本控制
我们继续查看<artifactId>spring-boot-dependencies</artifactId>
可以看到它使用 dependencyManagement 做了大量的版本管理
注:dependencyManagement 管理的依赖是不会被直接引入到我们的项目中的,它只是帮助做版本管理,如果我们要使用对应的jar包,还需要自己在项目中引入。
其中的依赖又分为了如下两种
- 对jar包的版本管理
<dependency> <groupId>org.xmlunit</groupId> <artifactId>xmlunit-placeholders</artifactId> <version>${xmlunit2.version}</version> </dependency>
- 对其它BOM的嵌套引入
<dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-bom</artifactId> <version>${cassandra-driver.version}</version> <!--type:pom 指定当前依赖的是一个BOM项目--> <type>pom</type> <!--scope:import 指定当前项目是从该BOM项目中引入dependencyManagement的版本依赖管理信息--> <scope>import</scope> </dependency>
3.3. 自己项目引入依赖的例子spring-boot-starter-web
我们这里在自己的spring boot项目中引入的<artifactId>spring-boot-starter-web</artifactId>jar包,我们就可以看到我们并没有指定它的jar包版本号,我们知道如果在maven项目中引入一个jar没有给它指定版本号,maven不能确定应该引入那个版本,项目启动是会报错的,所以它一定是在其他地方给他指定了。也就是3.2中的父项目spring-boot-starter-parent给他管理了。
4. SpringBoot配置
SpringBoot 是基于约定的, 所以很多配置都是有默认值, 但如果想使用自己的配置替换默认配置的话,就可以使用如下三种配置文件格式配置。
- application.properties
- application.yml
- application.yaml
默认文件名为application。它们的优先级为properties > yml > yaml 三种文件格式可以被同时加载,按优先级取值。
4.1. 配置文件为什么选择使用YML而不是XML
YAML文件的全称是YAML Ain't Markup Language(YML不是标记语言),也称为YAML文件。它是一种直观的、能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互。它可以被支持YAML库的不同的编程语言程序导入,如Java、C/C++、Ruby、Python、Perl、C#、PHP等。在Spring Boot中,YML文件(如application.yml)可以作为配置文件,用于修改Spring Boot自动配置的默认值。 YML文件是以数据核心的, 比传统的xml方式更加简洁.
我个人认为我们YML中配置基本都是给对象赋值,使用YML格式完全可以满足,而xml格式更为复杂,支持更多功能,如单个标签还支持设置各种属性(这些都是给对象赋值所不需要的)。那么它的解析必然更为复杂,手动配置也更容易出错。使用成本相对更高。
<table-cell border-style="solid" width="50px">
<block><xsl:value-of select="mdj"/></block>
</table-cell>
4.2 YML基本语法
- 大小写敏感
- 数据值前边必须有格式,有多个也可以,一般写一个,作为分隔符.
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键, 只允许使用空格.(因为Tab键(制表符)在不同操作系统中对应的空格数并不固定,这主要取决于具体的编程环境、编辑器或开发工具的设置。容易导致层次混乱.)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可.默认比上一层多2个。
- #表示注释. 从这个字符一直到行尾 ,都会被解析器忽略.
4.3. YML数据格式
4.3.1. 对象(map): 键值对的集合
@Data
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
}
server:
port: 8101
person:
name: allen wang
age: 30
可以得到对象:Person{name='allen wang', age=30}
4.3.2. 对象数组
@Data
@Configuration
@ConfigurationProperties(prefix = "persons")
public class PersonList {
List<Person> personList;
}
数组配置方式一:
server:
port: 8080
persons:
personList:
- name: zhang san
age: 80
- name: li si
age: 20
可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])
数组配置方式二:
server:
port: 8080
persons:
personList:
- {name: zhang san,age: 80}
- {name: li si,age: 20}
可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])
数组配置方式三:
persons:
personList: [{name: zhang san,age: 80},{name: li si,age: 20}]
可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])
4.3.3. 纯量(单个的,不可再分的值)
Msg1: 'hello \n world' #单引忽略转义字符
Msg2: "hello \n world" #双引识别转义字符
4.4. 读取YML配置方式
Spring boot读取配置内容三种方式。
- @Value 适用于单个属性
获取普通键值:@Value("${person.name}")
获取数组:@Value("${persons.personList[0]}") - Enrionment
@Autowired
private Environment env;@Autowired private Environment env; @RequestMapping("/helloUser") public String helloUser() throws JsonProcessingException { String name = env.getProperty("person.name"); return name; }
- @ConfigurationProperties(prefix = "person") 适用于对象和配置的绑定
如果不添加(prefix = "person")就会默认按照纯量在根目录下寻找对应变量
4.5. SpringBoot profile
我们在开发spring boot应用时, 通常同一套程序会被安装到不同环境,动态切换, 比如: 开发,测试,生产等. 其中数据库地址,服务器,端口等等配置都可能不同。如果每次打包时, 都要修改配置文件, 那么非常麻烦, profile功能就是来进行动态配置切换的。
4.5.1. Profile 配置方式
- 多个properties 合并成一个yml
固定写法---三个-分割--- Spring: profiles: dev Server: port: 8081 --- Spring: profiles: uat Server: port: 8082 --- Spring: profiles: prod Server: prot: 8083 --- Spring.profiles.active = dev
- YML多文档方式
配置多个properties或yml文件
如:application.yml (本文件中配置Spring.profiles.active = dev信息) application-dev.yml application-uat.yml application-uat.yml
4.5.2. profile激活方式
- 配置文件
Spring.profiles.active = dev
注意这个值必须要与yml文件的application-dev.yml 后面的值保持一致才能够生效. -
虚拟机参数(如cicd中的配置,idea本机配置)
本机idea中配置
VM options:
-Dspring.profiles.active=dev -
命令行参数
idea中配置
Program arguments:
--spring.profiles.active=dev
如果我们打成jar也可以使用java -jar xxx.jar -- spring.profiles.active=dev
5. SpringBoot 配置加载
Spring Boot Reference Documentation
java目录和resources目录下的文件打包后都会直接打包到classpath目录下
所以它的加载顺序从低到高分别如下:
1.Classpath:./ classpath的根目录
也就是我们项目放在resources根目录下然后直接被打包到classpath的根目录下。
2. Classpath:/config/: classpath的/config目录
3.file:./: 当前项目jar包所在的目录
4. file:./config/: 当前jar包所在目录的/config 目录下
外部配置和内部配置形成一种互补的配置。
外部配置优于内部配置