Spring Boot 自定义相关属性

在我们编写Spring Boot项目的时候,需要对一些值进行配置。但是有的时候我们不知道默认的属性有哪些(出了常用的),我们可以根据自己的需要进行自定义属性,
也可以根据不同的环境指定不同的配置文件。

自定义属性

需要将自定义的属性写入到src/main/resources/application.yml文件中,内容如下:

## Top level app properties
app:
  name: ConfigurationPropertiesDemoApp
  description: ${app.name} is a spring boot app that demonstrates how to use external configuration properties
  upload-dir: /uploads
  connect-timeout: 500ms
  read-timeout: 10s
  security:
    username: admin
    password: 123456
    roles: USER,ADMIN,PARTNER   # List Property
    enabled: true
    ## Map Properties (permissions)
    permissions:
      CAN_VIEW_POSTS: true
      CAN_EDIT_POSTS: true
      CAN_DELETE_POSTS: false
      CAN_VIEW_USERS: true
      CAN_EDIT_USERS: true
      CAN_DELETE_USERS: false

将属性与类进行绑定

如果想要将外部的属性与类类进行绑定,需要在类里面添加@ConfigurationProperties注解,并且指定前缀。绑定类的代码如下:

package com.edu.springboot.configurepropertiesdemo.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private String description;
    private String uploadDir;
    private Duration connectTimeout = Duration.ofMillis(1000);
    @DurationUnit(ChronoUnit.SECONDS)
    private Duration readTimeout = Duration.ofSeconds(30);
    private final Security security = new Security();
    //省略get/set方法
    public static class Security {
        private String username;
        private String password;
        private List<String> roles = new ArrayList<>();
        private boolean enabled;
        private Map<String, String> permissions = new HashMap<>();
        //省略get/set方法
    }
}

数据绑定

  • Type-safe binding:如果想要将属性绑定为list(roles),需要将类型使用逗号分割,permissions使用map来绑定。
  • Duration Support:默认的单位为毫秒。
  • Naming Convention:在命名的时候使用驼峰法,在转换的时候,可以使用驼峰或者kebab(使用-来连接)。

打开配置属性

在打开配置属性时,需要将添加@EnableConfigurationProperties注解,代码如下:

package com.edu.springboot.configurepropertiesdemo;
import com.edu.springboot.configurepropertiesdemo.config.AppProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class ConfigurePropertiesDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigurePropertiesDemoApplication.class, args);
    }
}

注入配置

package com.edu.springboot.configurepropertiesdemo.controller;
import com.edu.springboot.configurepropertiesdemo.config.AppProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class IndexController {
    @Autowired
    private AppProperties appProperties;
    @GetMapping("/")
    public Map<String, String> getAppDetails() {
        Map<String, String> appDetails = new HashMap<>();
        appDetails.put("name", appProperties.getName());
        appDetails.put("description", appProperties.getDescription());
        return appDetails;
    }
}

属性验证

可以使用注解方式,来防止某些配置为空,验证某些属性是否符合标准。

package com.edu.springboot.configurepropertiesdemo.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {
    @NotNull
    private String name;
    private String description;
    private String uploadDir;
    private Duration connectTimeout = Duration.ofMillis(1000);
    @DurationUnit(ChronoUnit.SECONDS)
    private Duration readTimeout = Duration.ofSeconds(30);
    @Valid
    private final Security security = new Security();
    //get/set方法省略
    public static class Security {
        private String username;
        private String password;
        @NotEmpty
        private List<String> roles = new ArrayList<>();
        private boolean enabled;
        private Map<String, String> permissions = new HashMap<>();
        //get/set方法省略
    }
}

指定配置文件

在默认情况下,读取application.yml/application.properties文件,Spring Boot项目中也允许根据环境创建相应的配置文件。

application-{profile}.properties

指定的配置文件也要放到src/main/resources文件下。

application-dev.yml

app:
  name: ConfigurationPropertiesDemoApp-DEVELOPMENT
  security:
    username: dev

application-stage.yml

app:
  name: ConfigurationPropertiesDemoApp-STAGING
  security:
    username: stage
    password: stage

application-prod.yml

app:
  name: ConfigurationPropertiesDemoApp-PRODUCTION
  security:
    username: prod
    password: prod

激活Profile

1.application profiles

spring.profiles.active=staging

2.命令行参数

mvn clean package -Dspring.profiles.active=staging
# Running the packaged jar with `spring.profiles.active` argument
java -jar -Dspring.profiles.active=staging target/config-properties-demo-0.0.1-SNAPSHOT.jar
#或者使用
mvn spring-boot:run -Dspring.profiles.active=dev

3.环境变量

export SPRING_PROFILES_ACTIVE=prod

运行应用程序

#运行
mvn spring-boot:run
#获取数据
curl http://localhost:8080
{"name":"ConfigurationPropertiesDemoApp","description":"ConfigurationPropertiesDemoApp is a spring boot app that demonstrates how to use external configuration

运行特定环境

#指定运行环境
mvn spring-boot:run -Dspring.profiles.active=prod
#运行结果
curl http://localhost:8080
{"name":"ConfigurationPropertiesDemoApp-PRODUCTION","description":"ConfigurationPropertiesDemoApp-PRODUCTION is a spring boot app that demonstrates how to use external configuration properties"}

也可以在pom.xml文件中添加要激活的环境。

代码放在github

参考文献

Spring Boot @ConfigurationProperties: Binding external configurations to POJO classes
Externalized Configuration
常用属性配置列表

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

推荐阅读更多精彩内容