洞见“葫芦”:当“不卖药”成为一种新哲学

核心内容摘要

跨越银幕的悸动:吴梦梦《到粉丝家》第二季重磅回归,谁才是真正的“主演”?
龙岩兄妹的UU奇遇记:从茶园到数字田野的蜕变之路

吃瓜主题大赛每日反差:意想不到的精彩,颠覆你的认知!

项目基础信息

项目结构基于 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); } }

Spring 容器配置补充

配置类注册 BeanConfiguration Beanjava运行package com.qcby.config; import com.qcby.service.HelloService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // 标记为配置类替代xml配置 Configuration public class MyAppConfig { // 注册Bean到容器默认名称为方法名helloService Bean public HelloService helloService(){ System.out.println(配置类Bean给容器中添加组件了...); return new HelloService(); } }

导入 XML 配置ImportResource若需兼容传统 XML 配置在启动类添加注解java运行package com.qcby; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; // 导入XML配置文件beans.xml SpringBootApplication ImportResource(locations classpath:beans.xml) public class Demo10Application { public static void main(String[] args) { SpringApplication.run(Demo10Application.class, args); } }

核心

注意事项配置绑定必须有 getter/setterSpring 底层通过 set 方法赋值无 set 方法则属性为 null配置前缀要匹配ConfigurationProperties(prefix person)需与配置文件中的 person 层级一致校验依赖必须引入Spring Boot

x 后校验注解从javax.validation迁移到jakarta.validation需引入spring-boot-starter-validation热部署生效条件devtools 依赖需加optionaltrueIDEA 需开启自动编译Settings - Build - Compiler - Build project automatically配置文件优先级application.yml application.properties同一配置在 yml 中定义会覆盖 properties。

总结Spring Boot 配置绑定优先使用ConfigurationProperties批量绑定、支持复杂类型单个配置可使用Value支持 SpEL参数校验需引入 validation 依赖配合Validated和jakarta.validation注解使用配置文件中 yml 格式层级更清晰优先级高于 properties核心语法包含占位符、随机值、复杂类型定义。

小红书直接打开-小红书直接打开应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123