SpringBoot中如何动态给属性赋值
非动态赋值的缺点
@RestController //保证返回的数据转化为JSON
public class JDBCController {
private String username; //定义数据库用户名
private String password; //定义数据库密码
@RequestMapping("/getMsg")
public String getMsg() {
this.username = "root";
this.password = "root";
return username+"|"+password;
}
}
上面这种方式将配置信息,通过代码的形式写死到代码中,这样的话程序的耦合性高,不便扩展
动态赋值
# yml 文件
jdbc:
username: root
password: root
可以在yml配置文件中书写配置信息,然后通过spel表达式来动态赋值,注意这时候的JDBC只是一个前缀
@RestController //保证返回的数据转化为JSON
public class JDBCController {
//1.需求:利用YML配置文件的信息为属性赋值
//@Value作用: 从spring容器中找到具体的key,为属性赋值.
@Value("${jdbc.username}") //spel表达式 spring提供
private String username; //定义数据库用户名
@Value("${jdbc.password}")
private String password; //定义数据库密码
@RequestMapping("/getMsg")
public String getMsg() {
this.username = "root";
this.password = "root";
return username+"|"+password;
}
@RequestMapping("/getMsgValue")
public String getMsgValue() {
return username+"|"+password;
}
}
但是有时某些配置可能需要很多的属性信息.如果这时利用@Value的方式赋值.则必然导致代码冗余.可读性差.这时就需要对动态赋值进行批量操作
批量动态赋值
1.引入依赖
<!--添加属性注入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.通过@ConfigurationProperties注解引入
@RestController
@ConfigurationProperties(prefix = "jdbc") //定义属性的前缀
public class JDBCController2 {
//批量为属性赋值时,要求配置文件的属性与类中的属性名称必须一致. 自动的赋值.
private String username; //定义数据库用户名
private String password; //定义数据库密码
//为属性赋值时,一定会调用对象的set方法.
@RequestMapping("/getMsgPrefix")
public String getMsgValue() {
return username+"|"+password;
}
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;
}
}
这样只要属性名相同就可以实现自动批量动态赋值