在实际的应用开发中,通常需要配置一些参数,例如数据库连接信息、服务端口、第三方 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;
}
注意:
- 属性类上的@Component或者@Configuration一定要加上,只有加上该注解,这个属性类才会被加载到Spring的容器中,才可被注入使用。
- 注入之前将的一样有JavaBean 属性绑定和构造器绑定,通常设置该属性类的getter、setter方法即可,否则属性值不能进行绑定,这里我们直接使用了@Data注解
- 需要注入的属性是写在配置文件中的,但是不排除通过命令行执行的时候注入情况java -jar app.jar –user.name=”Spring”
创建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 注解通常放在一个带有 @Component 或 @Configuration 注解的类上,以便被 Spring Boot 扫描并注入到容器中。
测试
修改为@ConfigurationProperties注解后重新启动项目发现可以启动成功,使用浏览器发送http://localhost:8080/person
,结果如下:
- age不存在默认值了
补充知识
${…}用于获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。
可以通过赋予默认值解决这个问题
@Value("${person.age:18}")
private Integer age;
总结:
- @Value 适用于简单的属性注入,可以直接在代码中使用,直接使用时代码复用性差。
- @ConfigurationProperties 适用于将一组相关的配置属性组织起来,并映射到一个 JavaBean 类中,提供更结构化的配置管理。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END