SpringBoot 是基于 Spring 框架的快速开发脚手架 ,可以帮开发者更简单、高效地搭建 Java 后端项目。它把 Spring 框架里复杂的配置(比如 XML 配置、依赖管理)了可以自动配置,让你不用写一堆配置就能快速跑起一个后端服务。
一、快速入门springboot



二、配置文件


1.YAML:数据格式
对象 (map):键值对的集合。
XML
person:
name: zhangsan
行内写法
person: {name: zhangsan}
数组:一组按次序排列的值
java
address:
-beijing
-shanghai
行内写法
address: [beijing, shanghai]
纯量:单个的、不可再分的值
java
msg1: 'hello \n world' # 单引忽略转义字符
msg2: "hello \n world" # 双引识别转义字符
2.yml配置
- 服务器核心配置(项目运行的基础)
java
# 服务器配置
#优先级properties>yml>yaml
server:
port: 8082 #必须带空格,分隔符,以数据为核心有缩进
servlet:
context-path: /boot
server.port: 8082:指定项目启动后占用的端口号(默认是 8080)。✅ 为什么要写:如果你的电脑上同时运行多个 Spring Boot 项目,8080 端口可能被占用,改个端口(比如 8082)就能避免冲突。server.servlet.context-path: /boot:指定项目的访问根路径。✅ 为什么要写:默认访问路径是http://localhost:8082/,加了这个配置后,必须用http://localhost:8082/boot/才能访问项目接口,避免不同项目的接口路径冲突。- 注释里的 "必须带空格、有缩进":YAML 格式的规则 ------ 冒号后必须加空格,层级靠缩进(2 个空格)区分,这是 YAML 的语法要求,写错了配置会失效。
2.参数引用

3.profile配置多文档模块

多文档块(Multi-document)写法,它的核心作用是:
在同一个 application.yml 文件里,把多个环境(开发、测试、生产)的配置都写在一起,
用 --- 分隔,不用再单独创建多个配置文件。
完整优先级顺序(从高到低)
1.命令行参数(比如启动时加 --server.port=9000)
2.激活的环境块(如 prod、dev 块)
3.全局块(第一个配置块)所以现在会用8084加载
java
#全局配置端口号8081
server:
port: 8081
spring:
profiles:
active: prod
---
#spring.profiles: dev 标记这个块属于 dev 环境。
# 当激活 dev 时,端口会被覆盖为 8083。
server:
port: 8083
spring:
profiles: dev
---
#这个块属于 prod 环境。
#当激活 prod 时,端口会被覆盖为 8084。
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
4.配置文件注入和参数校验

①value赋值
bash
/** 读取单个配置值@Value一个值注入一个对象,对象少的时候用
@Value("${person.lastName}")
private String lastName;
读取默认值(如果配置中没有该key,就用默认值)
@Value("${person.gender:男}")
private String gender;
value:适合读取单个、零散的配置项
支持默认值语法:${key:默认值}
不支持复杂类型(如 Map、List、嵌套对象)
配置项变化时,需要重启项目才能生效**/
②environment赋值
bash
/** Environment是spring核心环境抽象接口
* 全局获取配置信息,可以读取所有配置(包括系统环境变量、配置文件、命令行参数等)。
* 只需要注入一个对象就可以获取值
@Autowired
private Environment env;
@GetMapping("/env")
public String getEnv() {
// 读取配置项
String age = env.getProperty("person.age");
// 读取配置项并指定默认值
String email = env.getProperty("person.email", "default@xxx.com");
// 判断配置是否存在
boolean hasPort = env.containsProperty("server.port");**/
③@ConfigurationProperties
@Component:将当前类注册为Spring容器组件(必须)
作用:只有Spring容器中的Bean,才能被@ConfigurationProperties绑定
在主启动类添加@EnableConfigurationProperties(Person.class)
@ConfigurationProperties:批量绑定配置文件属性(核心知识点)
bash
@Component // 交给Spring管理
@ConfigurationProperties(prefix = "person")//表示属性一一注入
@PropertySource(value = {"classpath:person.properties"})
//加载指定的配置文件person.properties,@ConfigurationProperties可以从这些文件中取值,而不局限于全局配置。
④参数校验@Validated
css
@Validated// 开启数据校验
public class Person {
// @Email:校验lastName必须为邮箱格式
@Email(message = "lastName必须是合法邮箱格式")
@NotEmpty(message = "lastName不能为空") // 非空校验
private String lastName;
// @Min:校验age最小值为18(核心知识点)
// 作用:确保age≥18,否则启动报错
@Min(value = 18, message = "年龄不能小于18岁")
js303校验
空检查
@Null:验证对象是否为 null@NotNull:验证对象是否不为 null,无法查检长度为 0 的字符串@NotBlank:检查约束字符串是不是 Null 还有被 Trim 的长度是否大于 0,只对字符串,且会去掉前后空格@NotEmpty:检查约束元素是否为 NULL 或者是 EMPTY
Boolean 检查
@AssertTrue:验证 Boolean 对象是否为 true@AssertFalse:验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=):验证对象(Array, Collection, Map, String)长度是否在给定的范围之内@Length(min=, max=):Validates that the annotated string is between min and max included.
日期检查
@Past:验证 Date 和 Calendar 对象是否在当前时间之前@Future:验证 Date 和 Calendar 对象是否在当前时间之后@Pattern:验证 String 对象是否符合正则表达式的规则
三、内部配置加载顺序
高优先级覆盖低优先级
①内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
1. file:./config/:当前项目下的/config目录下
2. file:./:当前项目的根目录
3. classpath:/config/:classpath的/config目录(resources里的config )
4. classpath:/:classpath的根目录(resources 根目录**)**
加载顺序为上文的排列顺序,高优先级配置的属性会生效
②典型场景验证
假设四个位置都有 application.yml,且都配置了 server.port:
file:./config/application.yml →server.port=8081file:./application.yml →server.port=8082resources:/config/application.yml →server.port=8083resources:/application.yml →server.port=8084
✅ 最终生效端口是 8081(因为 file:./config/ 优先级最高)
③自定义配置位置
如果需要完全自定义配置文件路径,可以在启动时指定:
bash
java -jar your-project.jar --spring.config.location=/opt/config/application.yml
这个指定的路径优先级会高于默认的四个位置
四、外部配置加载顺序
🔝 最高优先级:命令行参数
启动时通过 --key=value 传入的参数,优先级最高,会覆盖所有其他配置。
bash
java -jar your-app.jar --server.port=8080 --person.name=张三
📂 外部文件配置加载顺序(从高到低)
file:./config/- 项目根目录下的
config文件夹(与 Jar 包同级) - 生产环境最常用,无需修改 Jar 包即可更新配置
- 项目根目录下的
file:./- 项目根目录(与 Jar 包同级)
- 适合测试环境快速验证配置
classpath:/config/- 类路径(
resources)下的config文件夹(内置配置) - 开发环境常用,配置随代码提交
- 类路径(
classpath:/- 类路径根目录(
resources根目录,内置配置) - 默认的
application.yml存放位置
- 类路径根目录(
五、自动配置原理
1.@EnableAutoConfiguration
css
// 表示这是一个配置类
@Configuration(proxyBeanMethods = false)
//自动配置属性:HttpProperties
@EnableConfigurationProperties(HttpProperties.class)
//spring的底层注解:根据不同条件,判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
}
自动配置类上的 @ConditionalOnXXX 系列注解会检查条件是否满足:
@ConditionalOnClass:类路径下存在指定类时生效。@ConditionalOnMissingBean:容器中不存在指定 Bean 时生效。@ConditionalOnProperty:配置文件中存在指定属性时生效。
2. 自定义配置:覆盖默认行为
自动配置并非不可修改,你可以通过以下方式自定义:
①配置文件修改
在 application.yml 中配置自动配置类对应的属性,比如修改 HTTP 编码:
spring:
http:
encoding:
charset: UTF-8
force: true
这些配置会绑定到**HttpProperties**类,从而修改自动配置的行为。
②手动注册 Bean 覆盖自动配置
如果容器中存在你手动注册的 Bean,自动配置会优先使用你的 Bean(因为多数自动配置类有 @ConditionalOnMissingBean 注解)。
css
@Configuration
public class MyWebConfig {
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
}
这个自定义的 CharacterEncodingFilter 会覆盖自动配置的默认过滤器。