1. 程式人生 > >Spring Boot配置繫結2.0實戰

Spring Boot配置繫結2.0實戰

一 新建pom

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
    </dependency>
</dependencies>

二 application.properties

com.didispace.foo=bar
#推薦使用全小寫配合-分割符的方式來配置
com.didispace.database-platform=sql
#使用[]來定位列表型別
#也支援逗號分隔方式,兩種方式等價
#com.didispace.post=Why Spring Boot,Why Spring Cloud

com.didispace.post[0]=Why Spring Boot
com.didispace.post[1]=Why Spring Cloud
#Map型別的定義格式如下
com.didispace.posts[0].title=Why Spring Boot
com.didispace.posts[0].content=It is perfect!
com.didispace.posts[1].title=Why Spring Cloud
com.didispace.posts[1].content=It is perfect too!

三 PostInfo

package com.didispace;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties
public class PostInfo {

    private String title;
    private String content;

}

四 FooProperties

package com.didispace;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "com.didispace")
public class FooProperties {

    private String foo;

    public String getFoo() {
        return foo;
    }

    public String getDatabasePlatform() {
        return databasePlatform;
    }

    private String databasePlatform;

}

五 啟動類

package com.didispace;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.context.ApplicationContext;

import java.util.List;


@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);

        Binder binder = Binder.get(context.getEnvironment());

        // 繫結簡單配置
        FooProperties foo = binder.bind("com.didispace", Bindable.of(FooProperties.class)).get();
        System.out.println(foo.getFoo());

        // 繫結List配置
        List<String> post = binder.bind("com.didispace.post", Bindable.listOf(String.class)).get();
        System.out.println(post);

        List<PostInfo> posts = binder.bind("com.didispace.posts", Bindable.listOf(PostInfo.class)).get();
        System.out.println(posts);

        // 讀取配置
        System.out.println(context.getEnvironment().containsProperty("com.didispace.database-platform"));
        System.out.println(context.getEnvironment().containsProperty("com.didispace.databasePlatform"));

    }

}

六 測試

bar
[Why Spring Boot, Why Spring Cloud]
[PostInfo(title=Why Spring Boot, content=It is perfect!), PostInfo(title=Why Spring Cloud, content=It is perfect too!)]
true
false

七 補充

屬性的讀取

對於一個屬性我們可以有多種不同的表達,但是如果我們要在Spring應用程式的environment中讀取屬性的時候,每個屬性的唯一名稱符合如下規則:

  • 通過.分離各個元素

  • 最後一個.將字首與屬性名稱分開

  • 必須是字母(a-z)和數字(0-9)

  • 必須是小寫字母

  • 用連字元-來分隔單詞

  • 唯一允許的其他字元是[和],用於List的索引

  • 不能以數字開頭

八 參考

http://blog.didispace.com/Spring-Boot-2-0-feature-1-relaxed-binding-2/