1.值的注入

方式一:

@ConfigurationProperties批量注入配置文件中的属性

实体类配置:

@Component @ConfigurationProperties(prefix = "person") public class person { private Integer id; private String name; private String address; private boolean boss; @DateTimeFormat(pattern = "yyyy/MM/dd") private Date birth; private Integer age; private String email; //getter/setter //toString

PersonController配置

@Controller public class PersonController { @Autowired private person person; @RequestMapping("/person") public void printPerson() { System.out.println(person); } }

yml配置:

server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" maps: k1: "value1" k2: "value2"

启动后拿到了值

方式二:@Value方式注入值

实体类有变,其余不变

@Component public class person { @Value("${person.id}") private Integer id; @Value("${person.name}") private String name; @Value("${person.address}") private String address; @Value("${person.boss}") private boolean boss; @Value("${person.birth}") @DateTimeFormat(pattern = "yyyy/MM/dd") private Date birth; @Value("${person.age}") private Integer age; @Value("${person.email}") private String email; //getter/setter //toString

启动后拿到了值

2.@ConfigurationProperties的松散绑定

在yml里加一个实体类中没有的字段hobby

server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" 验证松散绑定:增加一个实体类中没有的hobby,这时启动发现springboot没有报错,值也没有绑定上,springboot将其忽略了,这就是松散绑定 hobby: "篮球"

这时启动发现springboot没有报错,值也没有绑定上,springboot将其忽略了,这就是松散绑定

3.@Value的SqEL

SpEL是一种功能强大的表达式语言,可以在 Spring 中用来进行动态计算。

SpEL 允许你在 Spring 中进行动态计算,可以使用配置文件中的值进行加法、减法等操作,甚至进行更复杂的逻辑运算。

SqEL的意义:避免端口号冲突,将端口号增加一些偏移量

新建dog实体类

@Component public class dog { @Value("${dog.name}") // 从配置文件中注入 dog.name private String dogName; @Value("${dog.sex}") // 从配置文件中注入 app.version private String dogSex; // 使用 SpEL 计算动态值 @Value("#{${dog.port} + 1000}") // 动态计算新的端口值 private Integer adjustedPort; @Value("${dog.easilyMad}") private boolean easilyMad;

@Value("#{${dog.port} + 1000}") 是使用 SpEL 计算新的端口值

#{...}:这个大括号包裹的部分表示 SpEL 表达式。在这里,SpEL 表达式会计算里面的内容,计算结果会注入到 adjustedPort 字段中。

${dog.port} + 1000:这个表达式意味着获取 dog.port 的值(即 8080),然后加上 1000,最终的结果是 8080 + 1000 = 9080。

@Value("#{${dog.port} + 1000}"):Spring 会将 dog.port 的值(8080)与 1000 相加,得到 9080,然后将 9080 注入到 adjustedPort 字段中。

结果:

当 Spring 启动时,dog.port 的值被读取(在本例中为 8080),然后通过 SpEL 表达式将 8080 + 1000 的结果(即 9080)注入到 adjustedPort 字段。因此,adjustedPort 的值将是 9080。

yml改为

dog: name: "wangcai" sex: "雄性" port: 8080 easilyMad: true

新建dogController

@Controller public class DogController { @Autowired private dog dog; @RequestMapping("/dog") public void printDog() { System.out.println(dog); } }

启动测试

4.@ConfigurationProperties的JSR303数据校验

首先添加依赖

<!--数据校验的依赖--> <!-- Spring Boot Validator依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- Hibernate Validator实现 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version> </dependency>

在person实体类添加注解

@Min(18)//数据校验 设置最小年龄为18 private Integer age;

yml

server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 17 birth: "2026/12/06" email: "2041130670@qq.com" hobby: "篮球" # 这个属性会被忽略,因为在 Person 类中没有对应字段

实体类里设置的最小年龄为18,yml里写的是17所以启动报错

说明验证成功

5.@ConfigurationProperties的复杂封装

所谓复杂封装,就是字段的嵌套,我们在之前的address字段里嵌套street,city,posstalCode字段

新建address实体类

@Component @ConfigurationProperties(prefix = "person.address") public class address { private String street; private String city; private String postalCode;

目的是被springboot识别

@Component @ConfigurationProperties(prefix = "person.address")

将person实体类的address改成下面,意思为引用address类,所以这就是为啥上面要prefix = "person.address",这是在person类里引用了address类

private address address;

yml配置:

server: port: 8085 person: id: 1 name: "张三" address: street: "河北省" city: "石家庄" postalCode: "050000" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" hobby: "篮球" # 这个属性会被忽略,因为在 Person 类中没有对应字段 friends: - "李四" - "王五" - "赵六"

启动测试

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐