配置文件属性值的注入
使用@ConfigurationProperties注入属性
使用Spring Boot全局配置文件配置属性时,如果配置的属性是Spring Boot默认提供的属性(如:服务器端口),那么Spring Boot内部会自动扫描并读取属性值。如果配置的属性是用户自定义属性(如:实体类属性),则必须在程序中注入这些配置的属性方可生效。
1.使用@ConfigurationProperties注入属性
相关注解
- @Component
- @ConfigurationProperties(prefix=“xxx”)
用person实体类进行演示说明,代码如下:
@Component //生成当前类的实例对象存到IOC容器中
@ConfigurationProperties(prefix="person") //将配置文件中每个前缀为person的属性的值映射到当前类中的变量上
public class person {
private int id; //id
private String name; //姓名
private List hobby; //爱好
private String[] family; //家庭成员
private Map map;
private Pet pet; //宠物
...
}
接下来在测试类中,测试一下能不能注入成功:
class Chapter02ApplicationTests {
@Autowired
private Person person; //在容器中取出实例对象,完成注入
@Test
public void contextLoads() {
System.out.println(person);
}
}
在控制台可以看到打印成功的信息:
注意:使用@ConfigurationProperties注解批量注入属性值时,要保证配置文件中的属性与对应实体类的属性一致,否则无法正确获取并注入属性值。
2.使用@value注入属性
相关注解:
- @Component
- @Value
@Value注解的作用是注解普通数据类型,接下来在测试类中进行演示:
class Chapter02ApplicationTests {
private String name; //当前值为null
@Test
public void contextLoads() {
System.out.println(name);
}
}
现在需要把yaml里面的name的值注入进去:
@Value("${person.name}")
private String name;
打印测试一下:
说明:使用@Value注解对每个属性注入设置,免去了属性setXX()方法
两种注解对比分析
- @ConfigurationProperties主要是将配置文件中,某一类属性整体批量地读取并注入到某个Bean的属性中,而@Value是单个注入;
- @ConfigurationProperties本质是通过set()方法进行注入的;
- @ConfigurationProperties在进行注入时,支持任意类型,包括基本数据类型和复杂数据类型,@Value仅支持普通数据类型的注入;
- 松散绑定:一种配置文件的语法,示例代码如下:
person.firstName=Tom //标准写法
person.first_name=Tom //"_"分隔多个单词
person.first-name=Tom //"-"分隔多个单词
PERSON.FIRST_NAME=Tom //使用大小写格式,推荐常量属性配置
- 数据校验:校验配置文件中注入对应Bean属性的值是否符合相关值的规则,邮箱规则校验示例代码如下:
@Component
@ConfigurationProperties(prefix="person")
@Validated //引入Spring框架支持的数据校验规则
public class Example{
@Email //对属性进行规则匹配
private void setEmail(String email){
this.email=email;
}
}
- @Value注解注入配置文件属性时,支持SpEL表达式语法,即"#{XX}"。例如Person类有一个整数类型的属性id,直接使用SpEL表达式语法进行属性注入,示例代码如下:
@Value("#{5*2}") //使用@Value注解的SpEL表达式直接为属性注入属性值
private int id;
上述代码在不使用配置文件的情况下,直接使用@Value注解支持SpEL表达式注入Bean属性。
小结:
- 如果只是针对某一个业务需求,要引入配置文件中的个别属性值,推荐使用@Value注解;
- 如果针对某个JavaBean类,需要批量注入属性值,则推荐使用@ConfigurationProperties注解