SpringBoot @Value @ConfigurationProperties

前言

在平时的工作中,我们可能会需要从配置文件***.properties***.yml中获取一些配置参数。那么,在Spring Boot项目中我们可以使用@Value或者@ConfigurationProperties注解来获取。接下来,让我们一起探索这两个注解的详细使用方法吧。

在接下来的内容中,我们可以学习到如何在配置文件中配置 Key : ValuePOJOList<String>List<POJO>Map<String, String>Map<String, POJO> 结构,并在项目中使用 @Value@ConfigurationProperties 获取这些配置。

正文

@Value 与 @ConfigurationProperties 的区别

spring-boot 官方文档中,我们可以看到这段内容:

大致内容就是:

使用@Value("${property}")注解注入配置属性有时会很麻烦,尤其是当您使用多个属性或您的数据本质上是分层的时候。Spring Boot 提供了一种替代方法: @ConfigurationProperties,它让强类型 bean 管理和验证应用程序的配置项。

文档中还总结了@ConfigurationProperties vs @Value 各自支持的功能特性,如下图:

感兴趣的朋友可以点击上文中的链接去翻阅官方的详细文档,这里就不做过多介绍了。
言归正传,下面我们正式开始列举一些常用格式的配置项该如何使用@Value@ConfigurationProperties 去获取。

1. 配置简单的 Key : Value 结构

#### properties 文件配置格式:
app.environments-config.dev-url=https://dev.example.com

#### YML 文件配置格式:
app:
  environments-config:
    dev-url: https://dev.example.com

@Value 获取配置

@Value("${app.environments-config.dev-url}")
private String devUrl;

@ConfigurationProperties 获取配置
@Data
@Component
@ConfigurationProperties("app.environments-config")
public class Config {
    // 获取配置
    private String devUrl;

}


2. 配置 List<String> 结构

  2.1   List<String> - 逗号分隔方式

   2.1.1   properties 文件配置格式:

   2.1.2   YML 文件配置格式:

从上图中可以看出 @ConfigurationProperties 无需做任何操作就可以自动将以逗号连接的配置项转换为集合;而 @Value 则需要使用 SpEL 表达式来实现。至于为什么 @ConfigurationProperties 可自动实现转换,可以查阅官方文档 Relaxed Binding 这部分内容。

  2.2   List<String> - 数组方式 (仅限于@ConfigurationProperties)

   2.2.1   properties 文件配置格式:

app.environments-config.dev-url[0]=https://dev.example.com
app.environments-config.dev-url[1]=https://dev222.example.com

   2.2.2   YML 文件配置格式:

app:
  environments-config:
    dev-url:
      - https://dev.example.com
      - https://dev222.example.com


3. 配置 POJO 结构 (仅限于@ConfigurationProperties)

  3.1   properties 文件格式

  3.2   YML 文件格式:


4. 配置 List<POJO> 结构 (仅限于@ConfigurationProperties)

  4.1   properties 文件格式

  4.2   YML 文件格式

\color{#376956}{温馨提示:} 目录 4.1 及 4.2 中不论是 properties文件格式还是 YML文件格式,其中配置的 dev-users 都可使用以逗号分隔的方式来编写,会使配置文件显得更加简洁。

5. 配置 Map<String, String> 结构

  5.1   @Value 对应的写法

#### properties文件配置格式:
app.environments-config={"dev-url":"https://dev.example.com", "qa-url":"https://qa.example.com"} 

#### YML文件配置格式:
app:
  environments-config: '{"dev-url":"https://dev.example.com", "qa-url":"https://qa.example.com"}'

  // 获取配置 
  @Value("#{${app.environments-config}}")
  private Map<String, String> value;

  5.2   @ConfigurationProperties 对应的写法

#### properties文件配置格式
app.environments-config.dev-url=https://dev.example.com
app.environments-config.qa-url=https://qa.example.com

#### YML文件配置格式
app:
  environments-config:
    dev-url: https://dev.example.com
    qa-url: https://qa.example.com

  @Data
  @Component
  @ConfigurationProperties("app")
  public class Config {
      // 获取配置
      private Map<String, String> environmentsConfig;

  }


6. 配置 Map<String, POJO> 结构 (仅限于@ConfigurationProperties)

properties 文件配置方式:
#### 方式一:
app.environments-config.dev.url=https://dev.example.com
app.environments-config.dev.users=zhagnsan,lisi

app.environments-config.qa.url=https://qa.example.com
app.environments-config.qa.users=xiaobai,xiaohong
#### 方式二:
app.environments-config.dev.url=https://dev.example.com
app.environments-config.dev.users[0]=zhagnsan
app.environments-config.dev.users[1]=lisi

app.environments-config.qa.url=https://qa.example.com
app.environments-config.qa.users[0]=xiaobai
app.environments-config.qa.users[1]=xiaohong
YML 文件配置方式:
#### 方式一:
app:
  environments-config:
    dev:
      url: https://dev.example.com
      users: zhagnsan,lisi
    qa:
      url: https://qa.example.com
      users: xiaobai,xiaohong
#### 方式二:
app:
  environments-config:
    dev:
      url: https://dev.example.com
      users:
        - zhagnsan
        - lisi
    qa:
      url: https://qa.example.com
      users:
        - xiaobai
        - xiaohong
@ConfigurationProperties 获取配置
@Data
@Component
@ConfigurationProperties("app")
public class Config {
    // 获取配置
    private Map<String, EnvironmentsConfigBO> environmentsConfig;

    @Data
    public static class EnvironmentsConfigBO {
        private String url;
        private List<String> users;
    }

}

结语:

通过上面文章的介绍,我们可以看出:在配置简单的 Key : Value 及 List<String> 结构时,可以使用 @Value 去获取会更加方便,其他结构如:POJO、List<POJO>、Map<String, String>、Map<String, POJO> 则使用 @ConfigurationProperties 去获取。



扩展阅读:

@Value设置默认值

// 冒号后面的内容即为默认值
@Value("${app.environments-config.dev-url:http://localhost}")
private String devUrl;


使用JSR303注解进行有效性校验

一文学会JSR-303 参数校验,真香


绑定属性值到第三方jar中包含的Class

如果需要绑定属性值到第三方jar中包含的Class对象,我们是无法直接在Class上加上@ConfigurationProperties注解的,这时候可以在@Configuration标注的Class中定义一个需要绑定值的Class类型的bean,然后在该方法上加上@ConfigurationProperties。比如下面代码中通过initTestConfigurationProperties()定义了一个TestConfigurationProperties类型的bean,在该方法上加上了@ConfigurationProperties,Spring Boot就会为该bean进行属性值绑定。

@Configuration
public class TestConfig {

    @Bean
    @ConfigurationProperties("test.config")
    public TestConfigurationProperties initTestConfigurationProperties() {
        return new TestConfigurationProperties();
    }
    
}



相关链接:

官方文档
Spring Boot(07)——ConfigurationProperties介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容