SpringBoot 是基于 Spring 框架的快速开发脚手架,可以帮开发者更简单、高效地搭建 Java 后端项目。它把 Spring 框架里复杂的配置(比如 XML 配置、依赖管理)了可以自动配置,让你不用写一堆配置就能快速跑起一个后端服务。
一、快速入门springboot
二、配置文件
注解类:
@SpringBootConfiguration : springboot的配置
@Configuration: spring配置类
@Component: 说明这也是一个spring的组件
@EnableAutoConfiguration : 自动配置
@AutoConfigurationPackage : 自动配置包
@Import(AutoConfigurationPackages.Registrar.class) : 自动配置`包注册` @Import(AutoConfigurationImportSelector.class): 自动配置导入选择
1.YAML:数据格式
对象 (map):键值对的集合。
person: name: zhangsan 行内写法 person: {name: zhangsan}数组:一组按次序排列的值
address: -beijing -shanghai 行内写法 address: [beijing, shanghai]纯量:单个的、不可再分的值
msg1: 'hello \n world' # 单引忽略转义字符 msg2: "hello \n world" # 双引识别转义字符2.yml配置
1. 服务器核心配置(项目运行的基础)
# 服务器配置 #优先级properties>yml>yaml server: port: 8082 #必须带空格,分隔符,以数据为核心有缩进 servlet: context-path: /bootserver.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加载
# 1. 服务端口 server: port: 8080 # 2. 数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # 3. MyBatis-Plus 或 MyBatis mybatis-plus: configuration: map-underscore-to-camel-case: true # 下划线转驼峰 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL mapper-locations: classpath:mapper/*.xml # mapper.xml路径 type-aliases-package: com.xxx.entity # 别名包 //下面选择可以不写 # 日志级别 logging: level: com.xxx.mapper: debug # 打印SQL root: info # Spring 应用名(微服务必须写,单体可选) spring: application: name: my-project # Redis 配置(有缓存就写) redis: host: localhost port: 6379 password: database: 0 # 文件上传大小限制 spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB # 分页配置(MyBatis-Plus) mybatis-plus: global-config: db-config: logic-delete-field: is_deleted # 逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 04.配置文件注入和参数校验
①value赋值
/** 读取单个配置值@Value一个值注入一个对象,对象少的时候用 @Value("${person.lastName}") private String lastName; 读取默认值(如果配置中没有该key,就用默认值) @Value("${person.gender:男}") private String gender; value:适合读取单个、零散的配置项 支持默认值语法:${key:默认值} 不支持复杂类型(如 Map、List、嵌套对象) 配置项变化时,需要重启项目才能生效**/②environment赋值
/** 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:批量绑定配置文件属性(核心知识点)@Component // 交给Spring管理 @ConfigurationProperties(prefix = "person")//表示属性一一注入 @PropertySource(value = {"classpath:person.properties"}) //加载指定的配置文件person.properties,@ConfigurationProperties可以从这些文件中取值,而不局限于全局配置。④参数校验@Validated
@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/优先级最高)
③自定义配置位置
如果需要完全自定义配置文件路径,可以在启动时指定:
java -jar your-project.jar --spring.config.location=/opt/config/application.yml这个指定的路径优先级会高于默认的四个位置
四、外部配置加载顺序
🔝 最高优先级:命令行参数
启动时通过--key=value传入的参数,优先级最高,会覆盖所有其他配置。
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
// 表示这是一个配置类 @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注解)。
@Configuration public class MyWebConfig { @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); return filter; } }这个自定义的CharacterEncodingFilter会覆盖自动配置的默认过滤器。