在实际的应用开发中,通常需要配置一些参数,例如数据库连接信息、服务端口、第三方 API 地址等。
而这些参数的值可能因为不同的环境(开发、测试、生产)而有所不同,或者需要在不重启应用的情况下进行修改。
这就需要使用到我们使用到属性注入将参数数据进行注入
在SpringBoot中常用的简单类型参数进行配置属性注入的注解有以下两个:
@Value
注解: 用于从配置文件中注入简单类型的值@ConfigurationProperties
注解:用于将配置文件中的属性映射到对象中 接下来我们就详细介绍一下这个两个注解
@Value 注解
用于从配置文件中注入简单类型的值 @Value注解进行属性注入步骤如下:
在项目application.yml添加参数
user:
name: "张三"
age: 18
在项目中创建User对象
@Data
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
}
注意:
创建Controller进行验证
@RequestMapping("/person")
@RestController
public class PersonController {
@Autowired
private Person person;
@GetMapping
public String getPerson(){
return "name= "+ person.getName()+" age="+person.getAge();
}
}
启动项目,使用浏览器发送http://localhost:8080/person
,结果如下
思考:假如因为项目需要,我们不需要age=18这个值,是不是可以直接将age:18在yml文件中进行注释呢?
- 将age在yml注释
person:
name: "张三"
# age: 18
重新启动项目错误如下:person.age接收到一个非法或不合理的参数抛出该异常。
Caused by: java.lang.IllegalArgumentException:
Could not resolve placeholder 'person.age' in value "${person.age}"
思考:假如项目出现属性确实不需要默认值或者项目中涉及到很多个这样的数下,那么我们在每一个属性上都添加一个@value注解?
@ConfigurationProperties注解
使用@Value(“ $ {property}”)批注来注入配置属性有时会很麻烦,尤其是使用多个属性或数据本质上是分层时。 Spring Boot提供了
@ConfigurationProperties注解
使用属性的替代方法,该方法使强类型的Bean可以管理和验证应用程序的配置
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
// @Value("${person.name}")
private String name;
// @Value("${person.age}")
private Integer age;
}
注意:
prefix
: 指定属性前缀:属性指定配置文件中的属性前缀,所有以该前缀开头的属性将被映射到 JavaBean 类的对应字段。测试
修改为@ConfigurationProperties注解后重新启动项目发现可以启动成功,使用浏览器发送http://localhost:8080/person
,结果如下:
- age不存在默认值了
补充知识
${…}用于获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。
可以通过赋予默认值解决这个问题
@Value("${person.age:18}")
private Integer age;
总结:
- @Value 适用于简单的属性注入,可以直接在代码中使用,直接使用时代码复用性差。
- @ConfigurationProperties 适用于将一组相关的配置属性组织起来,并映射到一个 JavaBean 类中,提供更结构化的配置管理。