核心内容摘要
变身暗夜小甜心!萌白万圣节小恶魔套装,一秒点燃你的节日狂欢!
项目基础信息
项目结构基于 Maven 构建的 Spring Boot 项目核心依赖包含 web、validation、devtools 等JDK 版本17Spring Boot 版本
3.
2.
核心 POM 配置xmlproject xmlnshttp://maven.apache.org/POM/
4.
0 xmlns:xsihttp://www.w
org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/
4.
0 http://maven.apache.org/xsd/maven-
4.
0.
xsd modelVersion
4.
0/modelVersion groupIdcom.qcby/groupId artifactIddemo10/artifactId version
0-SNAPSHOT/version packagingjar/packaging parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version
3.
0/version /parent properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies !-- Web 核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !-- 热部署依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId optionaltrue/optional /dependency !-- 参数校验依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency /dependencies /project
配置文件语法Spring Boot 支持application.properties和application.yml两种配置格式优先读取 yml层级更清晰。
基础配置示例application.ymlyaml# 应用配置 app: name: demo-app port: 8081 allowed-ips: [
127.
0.
1,
192.
168.
1] # 复杂对象配置 person: last-name: 张三${random.uuid} # 拼接随机UUID age: ${random.int} # 随机整数 birth: 2017/12/15 # 日期类型 boss: false # 布尔类型 maps: # Map类型 k1: v1 k2: 14 lists: [a, b, c] # List类型 dog: # 嵌套对象 name: ${person.hello:hello}_dog # 占位符默认值 age: 15 # 用户配置用于校验 user: id: 1 username: # 空值用于校验演示 password: 123456 age: 25 email: lisiexample.com
properties 格式对比application.propertiesproperties# 注意properties 中特殊字符需转义层级用 . 分隔 person.last-name张三${random.uuid} person.age${random.int} person.birth2017/12/15 person.bossfalse person.maps.k1v1 person.maps.k214 person.listsa,b,c person.dog.name${person.hello:hello}_dog person.dog.age
核心语法说明占位符${key}引用其他配置${key:默认值}当 key 不存在时使用默认值随机值${random.uuid}随机 UUID、${random.int}随机整数复杂类型Map、List、嵌套对象均支持yml 用缩进表示层级properties 用.分隔层级。
配置绑定方式
ConfigurationProperties推荐批量绑定核心规则注解加在类上通过prefix指定配置前缀类必须交给 Spring 容器管理Component必须提供 getter/setter 方法Spring 底层通过反射赋值支持复杂类型Map、List、嵌套对象。
示例 1Person 类绑定配置java运行package com.qcby.model; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; import java.util.List; import java.util.Date; Component // 交给Spring容器管理 ConfigurationProperties(prefix person) // 绑定person前缀的配置 public class Person { private String lastName; private Integer age; private Date birth; private Boolean boss; private MapString, Object maps; private ListObject lists; private Dog dog; // 嵌套对象 // 嵌套静态内部类也可单独定义 public static class Dog { private String name; private Integer age; // 必须提供getter/setter public String getName() { return name; } public void setName(String name) { this.name name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } Override public String toString() { return Dog{ name name \ , age age }; } } // 所有属性的getter/setter public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName lastName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth birth; } public Boolean getBoss() { return boss; } public void setBoss(Boolean boss) { this.boss boss; } public MapString, Object getMaps() { return maps; } public void setMaps(MapString, Object maps) { this.maps maps; } public ListObject getLists() { return lists; } public void setLists(ListObject lists) { this.lists lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog dog; } Override public String toString() { return Person{ lastName lastName \ , age age , birth birth , boss boss , maps maps , lists lists , dog dog }; } }示例 2Value 单个绑定Value适合单个配置注入不支持复杂类型Map/List语法更灵活支持 SpEL。
java运行package com.qcby.model; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; Component public class ValueDemo { // 注入单个配置值 Value(${app.name}) private String appName; // 支持默认值当app.port不存在时使用8080 Value(${app.port:8080}) private Integer appPort; // 支持SpEL表达式Spring表达式语言 Value(#{T(java.lang.Math).random() * 100}) private Double randomNum; Override public String toString() { return ValueDemo{ appName appName \ , appPort appPort , randomNum randomNum }; } }
ConfigurationProperties vs Value 对比特性ConfigurationPropertiesValue批量绑定支持不支持复杂类型Map/List支持不支持SpEL 表达式不支持支持默认值支持配置文件中支持注解中校验注解支持配合 Validated不支持
参数校验JSR-380基于jakarta.validation注解配合Validated开启校验需引入spring-boot-starter-validation依赖。
核心注解说明注解作用适用类型NotNull不能为 null所有类型NotBlank不能为 null / 空字符串 / 全空格字符串字符串Min(value)最小值数值类型int/longMax(value)最大值数值类型Email邮箱格式校验字符串
校验示例User 类java运行package com.qcby.model; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Min; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; Component ConfigurationProperties(prefix user) Validated // 开启参数校验核心 public class User { private Long id; NotBlank(message 用户名不能为空) // 字符串非空校验 private String username; NotBlank(message 密码不能为空) private String password; NotNull(message 年龄不能为空) // 不能为null Min(value 18, message 年龄不能小于18岁) // 最小值校验 private Integer age; private String email; // getter/setter 必须提供 public Long getId() { return id; } public void setId(Long id) { this.id id; } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public String getEmail() { return email; } public void setEmail(String email) { this.email email; } Override public String toString() { return User{ id id , username username \ , age age , email email \ }; } }
校验生效规则必须在类上添加Validated注解校验注解加在字段上支持自定义提示语message若配置值不满足校验规则项目启动时会抛出BindException异常。
配置绑定实战Controller 调用通过Autowired注入绑定配置的类直接使用配置值。
java运行package com.qcby.controller; import com.qcby.model.Person; import com.qcby.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController // 等同于Controller ResponseBody public class HelloController { Autowired // 注入配置绑定的Person对象 private Person person; Autowired // 注入配置绑定的User对象 private User user; RequestMapping(/list) public void printConfig() { // 打印配置值 System.out.println(person); System.out.println(user); } }