Spring Boot配置绑定
如果觉得写的还可以,点个赞支持一下笔者呗!你的点赞和关注会让我更快更新哦。笔者会持续更新关于Java和大数据有关的文章。目前集中精力在更新java框架的内容。
所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
SpringBoot 提供了以下 2 种方式进行配置绑定:
- 使用 @ConfigurationProperties 注解
- 使用 @Value 注解
@ConfigurationProperties
通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。
下面我们以 Spring Boot 项目 helloworld 为例,演示如何通过 @ConfigurationProperties 注解进行配置绑定。
1. 在 helloworld 的全局配置文件 application.yml 中添加以下自定义属性。
person: lastName: zjcage: 18boss: falsebirth: 1990/12/12maps: { k1: v1,k2: 12 } lists: ‐lisi‐zhaoliudog: name: kkage: 5
2. 创建一个名为 Person 的实体类,并将配置文件中的属性映射到这个实体类上,代码如下。
prefix="person") (publicclassPerson { privateStringlastName; privateIntegerage; privateBooleanboss; privateDatebirth; privateMap<String, Object>maps; privateList<Object>lists; privateDogdog; publicPerson() { } publicStringgetLastName() { returnlastName; } publicvoidsetLastName(StringlastName) { this.lastName=lastName; } publicIntegergetAge() { returnage; } publicvoidsetAge(Integerage) { this.age=age; } publicBooleangetBoss() { returnboss; } publicvoidsetBoss(Booleanboss) { this.boss=boss; } publicDategetBirth() { returnbirth; } publicvoidsetBirth(Datebirth) { this.birth=birth; } publicMap<String, Object>getMaps() { returnmaps; } publicvoidsetMaps(Map<String, Object>maps) { this.maps=maps; } publicList<Object>getLists() { returnlists; } publicvoidsetLists(List<Object>lists) { this.lists=lists; } publicDoggetDog() { returndog; } publicvoidsetDog(Dogdog) { this.dog=dog; } publicPerson(StringlastName, Integerage, Booleanboss, Datebirth, Map<String, Object>maps, List<Object>lists, Dogdog) { this.lastName=lastName; this.age=age; this.boss=boss; this.birth=birth; this.maps=maps; this.lists=lists; this.dog=dog; } publicStringtoString() { return"Person{"+"lastName='"+lastName+'\''+", age="+age+", boss="+boss+", birth="+birth+", maps="+maps+", lists="+lists+", dog="+dog+'}'; } }
注意:
- 只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Component 注解来添加组件到容器中。
- JavaBean 上使用了注解 @ConfigurationProperties(prefix = "person") ,它表示将这个 JavaBean 中的所有属性与配置文件中以“person”为前缀的配置进行绑定。
创建一个名为 Dog 的 JavaBean,代码如下。
publicclassDog { privateStringname; privateStringage; publicDog() { } publicDog(Stringname, Stringage) { this.name=name; this.age=age; } publicvoidsetName(Stringname) { this.name=name; } publicvoidsetAge(Stringage) { this.age=age; } publicStringgetName() { returnname; } publicStringgetAge() { returnage; } }
修改 HelloController 的代码,在浏览器中展示配置文件中各个属性值,代码如下。
publicclassHelloController { privatePersonperson; "/hello") (publicPersonhello() { returnperson; } }
@Value
当我们只需要读取配置文件中的某一个配置时,可以通过 @Value 注解获取。
1. 以 Spring Boot 项目 helloworld 为例,修改实体类 Person 中的代码,使用 @Value 注解进行配置绑定,代码如下。
publicclassPerson { "${person.lastName}") (privateStringlastName; "${person.age}") (privateIntegerage; "${person.boss}") (privateBooleanboss; "${person.birth}") (privateDatebirth; privateMap<String, Object>maps; privateList<Object>lists; privateDogdog; publicPerson() { } publicStringgetLastName() { returnlastName; } publicvoidsetLastName(StringlastName) { this.lastName=lastName; } publicIntegergetAge() { returnage; } publicvoidsetAge(Integerage) { this.age=age; } publicBooleangetBoss() { returnboss; } publicvoidsetBoss(Booleanboss) { this.boss=boss; } publicDategetBirth() { returnbirth; } publicvoidsetBirth(Datebirth) { this.birth=birth; } publicMap<String, Object>getMaps() { returnmaps; } publicvoidsetMaps(Map<String, Object>maps) { this.maps=maps; } publicList<Object>getLists() { returnlists; } publicvoidsetLists(List<Object>lists) { this.lists=lists; } publicDoggetDog() { returndog; } publicvoidsetDog(Dogdog) { this.dog=dog; } publicPerson(StringlastName, Integerage, Booleanboss, Datebirth, Map<String, Object>maps, List<Object>lists, Dogdog) { this.lastName=lastName; this.age=age; this.boss=boss; this.birth=birth; this.maps=maps; this.lists=lists; this.dog=dog; } publicStringtoString() { return"Person{"+"lastName='"+lastName+'\''+", age="+age+", boss="+boss+", birth="+birth+", maps="+maps+", lists="+lists+", dog="+dog+'}'; } }
@Value 与 @ConfigurationProperties 对比
@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。
1. 使用位置不同
- @ConfigurationProperties:标注在 JavaBean 的类名上;
- @Value:标注在 JavaBean 的属性上。
2. 功能不同
- @ConfigurationProperties:用于批量绑定配置文件中的配置;
- @Value:只能一个一个的指定需要绑定的配置。
3. 松散绑定支持不同
@ConfigurationProperties:支持松散绑定(松散语法),例如实体类 Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:
- person.firstName
- person.first-name