SpringBoot中@ConfigurationProperties和@value绑定配置信息的区别
程序员文章站
2024-01-08 08:38:36
...
一[email protected]绑定配置信息
1.编写Bean
/*
* 读取配置文件application.properties中配置,不需要注解@PropertySource指定配置文件位置。
* 配置文件路径:properties/config.properties
* @ConfigurationProperties:告诉springboot将本类中所有属性和配置文件中相关的配置进行绑定;
* prefix="person":指出将配置文件中person下的所有属性进行一一映射;
*
* 注意:只有当前这个类是容器中的组件时,才可以用容器提供的@ConfigurationProperties功能;
*
* */
@PropertySource(value = {"classpath:properties/config.properties"})
@ConfigurationProperties(prefix="person")
@Data
@Component
public class PersonConfigurePropertiesBean {
private String userName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Car myCar;
private List<Car> myCarLists;
private Map<String,Car> myCarMap;
}
@Data
public class Car {
private String colour;
private Integer prize;
}
2.配置信息
#配置person的属性值
#------------------------------------普通属性
person.user-name=cuihua
person.age=18
person.boss=false
person.birth=1992/02/20
#------------------------------------map集合
person.maps[k1]=jone
person.maps[k2]=peter
#等价于
#person.maps.k1=jone
#person.maps.k2=peter
#------------------------------------List集合跟数组
person.lists=a,b,c
#等价于
#person.lists[0]=a
#person.lists[1]=b
#person.lists[2]=c
#-------------------------------------对象测试
person.myCar.colour=red
person.myCar.prize=100000
#等价于
#person.myCar[colour]=red
#person.myCar[prize]=100000
#------------------------------------复杂list测试
person.myCarLists[0].colour=red
person.myCarLists[0].prize=10000
#等价于
#person.myCarLists[0][colour]=red
#person.myCarLists[0][prize]=10000
#--------------------------------------复杂的map测试
person.myCarMap[k1].colour=red
person.myCarMap[k1].prize=10000
#等价于
#person.myCarMap[k1][colour]=red
#person.myCarMap[k1][prize]=10000
#等价于
#person.myCarMap.k1.prize=10000
#等价于
#person.myCarMap.k1.[prize]=10000
3.测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationConfig {
@Autowired
PersonConfigurePropertiesBean personConfigurePropertiesBean;
@Test
public void testPersonProperties(){
System.out.println(personConfigurePropertiesBean);
}
}
4.结果
PersonConfigurePropertiesBean(userName=cuihua, age=18, boss=false, birth=Thu Feb 20 00:00:00 CST 1992, maps={k2=peter, k1=jone}, lists=[a, b, c], myCar=Car(colour=red, prize=100000), myCarLists=[Car(colour=red, prize=10000)], myCarMap={k1=Car(colour=red, prize=10000)})
二[email protected]绑定配置信息
1编辑Bean
PropertySource(value = {"classpath:properties/config.properties"})
//@ConfigurationProperties(prefix="person")
@Data
@Component
public class PersonConfigurePropertiesBean {
@Value("${person.user-name}")
private String personuserName;
@Value("#{5*2}") // spring表达式
private Integer age;
@Value("true") // boolean值
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Car myCar;
private List<Car> myCarLists;
private Map<String,Car> myCarMap;
}
2.结果
PersonConfigurePropertiesBean(personuserName=cuihua, age=10, boss=true, birth=null, maps=null, lists=null, myCar=null, myCarLists=null, myCarMap=null)
@ConfigurationProperties和@Value对比
功能 | @ConfigurationProperties | @Value |
根据配置文件中设置的属性 | 批量注入属性值 | 单个指定值 |
松散语法 | 支持(lastName可以写作last-name、last_name) | 不支持 |
SpEL(Spring表达式) | 不支持 | 支持 |
复杂类型封装 | 支持 | 不支持 |
JSR303数据校验 | 支持(可以通过@Email等注解校验属性值是否符合要求) | 不支持 |
应用场景
如果只是某个业务中需要获取配置文件中的某项值或者设置具体值,可以使用@Value;
如果一个JavaBean中大量属性值要和配置文件进行映射,可以使用@ConfigurationProperties;
参考:https://blog.csdn.net/XU906722/article/details/81517429