欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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