最新の設定ファイルと優先順位の詳細7_ゼロエントリから春ブート構成

この記事では、作成した部分であり、マイクロチャネルアプレットにソース、歓迎の注意を示して再現し小白AI博客たマイクロチャンネル公衆番号小白AIやWebサイトのxiaobaiai.netや私CSDN blog.csdn.net/freeape

[TOC]

0はじめに

実際のプロジェクトの開発を入力し、私たちは、デフォルトグローバルコンフィギュレーションファイルに頼っていないapplication.properties私たちのプロジェクトのアップ、春のブートコンフィギュレーションファイルを設定するには、注意を必要とする多くの分野があり、マスター、あなたは簡単に私たちは途中でプロジェクトをやらせることができます様々な構成のエッジは、基準の将来を促進することに加えて、一見、明確な明確な階層モジュール、書かれた要約で構成しましょう。記事の内容、最新のコンフィギュレーションファイルの内容を導入することで、2019年11月21日のように書かれた最新の公式ドキュメントへのすべての参照、春になると5.2.1、バージョン、春ブーツがある2.2.1バージョン。

私たちは、理解する必要がある1

Spring Boot提供spring-boot-devtoolsのjarパッケージには、プログラム開発のいくつかの便利な機能を提供し、主な変更点は、監視プログラムであり、その後、自動的に再起動します。使用spring-boot-devtoolsする必要がpom.xml同じ時間に依存関係を追加するには、設定する必要がありますデフォルトでは、唯一のでしょうによって有効になり、プラグインをパッケージ化する際には含まれませんデフォルト true spring-boot-devtools开发环境Spring Bootspring-boot-devtools

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>复制代码

2はじめとグローバルの概要

作成Spring Boot後にプロジェクトを、それがされますsrc/main/resourcesデフォルトでグローバル・コンフィギュレーション・ファイルのディレクトリを生成しapplication.propertiesますが、どのような何のコンテンツがありません。春ブーツは、すべてのデフォルト設定パラメータが自動的に設定されている(https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html)、我々は外部の構成である場合設定ファイルを変更し、デフォルトの設定パラメータは、(外部化設定、変更される外部化設定を使用すると、プロパティファイルを使用することができますいくつかの方法(プロパティファイル)、YAMLファイル、環境変数、およびコマンドライン引数がある設定を外部化、)コンフィギュレーションを外部、以下の内容を詳細に説明します。

例えば、コンフィギュレーション・ファイルをすることができapplication.propertiesいずれかでapplication.yml、あなただけのだけの設定構文ではない、いくつかのに比べて明確な形式のプロパティに同じ、YMLレベルフォーマット内で、設定することができます。

.properties執筆:

server.port = 9090
spring.application.name = demoservice复制代码

.yml執筆:

spring:
    application:
        name: demoservice
   server:
port: 9090复制代码

注:YML形式は、タブを使用してはならないが、タブ、コロンと値の間にスペースを持っている必要があります。

春ブーツは、次のようにここに要約我々は注意を払う必要があるシーケンスを、(カバー)のパラメータを書き換える必要があります:

  1. ときDevtoolsの時間は、$HOME/.config/spring-bootグローバルなフォルダセットのプロパティをデベロッパーツール
  2. @TestPropertySourceテスト上の注意事項について
  3. テストproperties@SpringBootTestアプリケーションの特定の部分をテストするためのコメントやテストを提供
  4. コマンドラインパラメータ
  5. SPRING_APPLICATION_JSONプロパティ(JSON組み込みシステムや環境変数のプロパティ)の
  6. ServletConfig初期化パラメータ
  7. ServletContext初期化パラメータ
  8. JNDIプロパティ:java:comp/env
  9. Javaシステムプロパティ: System.getProperties()
  10. オペレーティングシステム環境変数
  11. RandomValuePropertySource、そのプロパティのみでrandom.*
  12. パッキンjar之外特定のアプリケーションプロファイル属性(例えばapplication-{profile}.properties、対応する可変YAML)を
  13. パッケージ在jar中(例えば、プロファイルに特異的な適用特性をapplication-{profile}.properties可変YAML)
  14. パッケージ化されたjar之外アプリケーションのプロパティ(application.propertiesおよび変数YAML)
  15. パッケージ化された在jar中アプリケーションのプロパティ(application.propertiesおよび変数YAML)
  16. @Configurationクラス上@PropertySourceの注意事項
  17. (設定して、デフォルトプロパティSpringApplication.setDefaultPropertiesに指定)

上記順序が有効である方法を説明するための具体的な例として:

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...
}复制代码

例えば、アプリケーション・クラス・パス(例えば、パッケージング在jar内上の)が存在してもよいapplication.propertiesファイル、ファイルがnameセットデフォルト属性のプロパティ値。新しい環境での実行は、それができる在jar外部提供application.propertiesカバー上書きしますファイル、在jar内のをapplication.properties別の例では、使い捨てのテストのために、特定のコマンドラインを開始するためにスイッチを使用することができる(例えば、java -jar app.jar --name="Spring")覆われていてもよいname属性値。別の例JSON形式の環境変数をすることができます$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar覆われています。それ以外の場合ではない一例ずつ。

3設定パラメータ

そして、オーダーパラメータの設定3.1ディレクトリおよび負荷の優先順位の役割

そこ二つの方法構文、パラメータ、ありproperties、一つはymlSpringApplicationからapplication.propertiesファイルの次の属性の積載位置、およびに追加しますSpring环境

  1. 現在のプロジェクトディレクトリのconfigサブディレクトリ
  2. 現在のプロジェクトのルートディレクトリ
  3. クラスパス設定されたディレクトリのconfigサブディレクトリ
  4. セットクラスパスディレクトリ

上記のリストは、優先順位でソート(定義された属性を覆う低い位置に定義された属性のリストに高い位置、カバー内の第2の属性集合の属性値と同じ属性値)。

注:Mavenの、src / main / resourcesディレクトリでプロジェクトをビルドする場合は、デフォルトのクラスパスです

また、そのYMLポイントと特別な使用法の下で、ここで注意してください。

  • YML形式はタブタブ、コロンと値の間で使用することはできません一定要有空格 一定要有空格 一定要有空格
  • などの特殊文字は、それ自体の特殊文字出力関数内の文字列をエスケープしませんYML二重引用符、
  • YMLの特殊文字は、文字列内の元の文字の出力を単一引用符をエスケープします
# 下面会输出得到hello换行xiaobaiai.net
name: "hello\nxiaobaiai.net"
# 下面会输出得到hello\nxiaobaiai.net
name: 'hello\nxiaobaiai.net'复制代码
  • YML支持物体、アレイ、スカラー(文字列、ブール真/偽、整数、浮動小数点、ヌル、時間、日付new Date('1976-07-31')
# 对象行内写法
students: { name: Steve, age: 22 }
# 数组行内写法
animal: [Cat, Dog]
# 或者数组非行内写法
animal:
    - Cat
    - Dog复制代码

値3.2パラメータのランダム設定を生成します

パラメータまたはいくつかのテストシナリオでランダムな値を生成すると便利な設定です。

我々の構成など:

#random int
app.location-x=${random.int}
app.location-y=${random.int}

#random int with max
app.user-age=${random.int(100)}

#random int range
app.max-users=${random.int[1,10000]}

#random long with max
app.refresh-rate-milli=${random.long(1000000)}

#random long range
app.initial-delay-milli=${random.long[100,90000000000000000]}

#random 32 bytes
app.user-password=${random.value}

#random uuid. Uses java.util.UUID.randomUUID()
app.instance-id=${random.uuid}复制代码

最終的な出力:locationX=-449689812, locationY=-2048116572, userAge=88, maxUsers=8927, refreshRateMilli=418859, initialDelayMilli=12542150790115755, userPassword=95ea8b43fd16dc26aad0030c1340e723, instanceId=bd252902-54e9-47b3-bebf-a81b1300ff69

3.3パラメータ参照(プレースホルダ)

:前プレースホルダを参照することによって実現されるパラメータのパラメータ値のような、構成で定義することができます

app.name=MyApp
app.description=${app.name} is a Spring Boot application复制代码

一部の人々が使用するために(たとえば)好きな--port=9000のではなく、--server.port=9000コマンドラインで構成プロパティを設定します。application.properties使用占位符この動作を有効にするには:

server.port=${port:8080}复制代码

注:あなたが継承した場合spring-boot-starter-parentPOM、リソースからマーカーをスクリーニングしたプラグインMavenのデフォルト${*}の変更@(すなわち、@maven.token@代わりに${maven.token}春スタイルプレースホルダとの競合を防ぐために)。直接場合はapplication.propertiesMavenのフィルタリングが有効になって、あなたはまた、代わりに他の区切り文字としてラベルデフォルトのフィルタを変更する必要があります@

3.4カスタムプロファイル

3.4.1方法

あなたが好きではない場合はapplication.properties、プロファイル名として、次のように指定することができspring.config.name、環境プロパティの別のファイル名にスイッチを。また、使用することができるspring.config.location場所のプロファイルを指定するには、環境属性(パスのファイルまたはディレクトリの場所をコンマで区切ったリストを)。別のファイル名を指定する方法を次の例が示します:

$ java -jar myproject.jar --spring.config.name=myConfig复制代码

二つの位置を指定する方法を次の例が示します:

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties复制代码

場合spring.config.location(ファイルではなく)ディレクトリ、あなたがする必要が/終了し、ランニング、コンフィギュレーションをロードする前に、あなたはに添付しなければならないspring.config.name設定の名前またはデフォルトの設定名。デフォルトの設定ではありませんspring.config.location、設定ファイルの検索順序:

file:./config/
file:./
classpath:/config/
classpath:/复制代码

カスタム配置位置を使用して構成されspring.config.location、彼らは、デフォルトの位置を交換します。例えば、場合spring.config.location設定の値classpath:/custom-config/,file:./custom-config/、検索順序は次のようになります。

file:./custom-config/
classpath:custom-config/复制代码

カスタム設定が位置を配置した場合spring.config.additional-location、追加の設定パスに加えて、デフォルトの場所を使用します。デフォルトの位置の前に他の場所を検索します。

注:プログラミング環境では、spring.config.nameは、実際にのみ、コマンドラインまたはセット環境変数ないapplication.propertiesに直接提供されるexport SPRING_CONFIG_NAME=myConfigか、または指定されたパスにコード手動でインポート構成ファイルにデコーディングされました。

3.4.2第二の方法

このセクションで後述するカスタムプロパティと、このように、実際には、達成するための設定ファイルをロードし、直接コーディングすることにより、指定された同じ、唯一のより指定されたファイル名のコメントよりも、より詳細には、操作の後ろに見ることができます。例えば、我々は作成test.propertiesしてパス上にも、src/main/resources以下:

my.app.name=hello
my.app.func=test复制代码

その後、新しいパラメータ豆を作成します。

@Configuration
@ConfigurationProperties(prefix="my.app") 
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
    private String name;
    private String func;
    // 省略getter和setter
}复制代码

[OK]をので、どのように検証は、カスタム設定パラメータのセクションを参照してくださいすることができています。

3.5コマンドラインの設定パラメータ

デフォルトでは、SpringApplicationすべてのコマンドラインオプションパラメータ(すなわち--例えば、起動パラメータ--server.port=9000)プロパティに、およびに追加しますSpring环境第四の属性するためにコマンドラインは、上述したように、その優先順位は常にソースプロパティの下にあります。

あなたは春のコマンドラインに属性にしたくない場合环境は、プログラムを使用することができSpringApplication.setAddCommandLineProperties(false)、それらを無効にします。

3.6プロパティ固有の設定ファイル(活性化プロファイル)

加えてapplication.properties、文書、次の命名規則は、特定の特性プロファイルを定義するために使用することができます:application-{profile}.properties環境は、活性プロファイルが、デフォルト設定されていない場合、デフォルトのコンフィギュレーションファイル(デフォルトのデフォルトのプロファイル、即ちapplication-default.properties)のセットを持つapplication-default.propertiesのファイル、またはローディング順位と優先application.properties同じ。Springこれは、コンフィギュレーションを含むビーン、依存性、ロード、異なる環境プロファイル決意プログラムで実装することができるSpringDEV(開発)、テスト(単体テスト)、QA(統合テスト)のProd(本番環境)を含むプロファイルの一般的な項目を。同様に、Mavenの、プロファイル設定が設定依存、行動を含む、異なったプロファイル環境のビルドプロセス中に異なる動作を実行することができ、各プロファイルが提供されてもよい。ID(一意の識別子)、プロパティ(設定プロパティ)活性化(論理状態が自動的にトリガ)、依存関係(依存性)等が挙げられます。

ここでは、どのようにプロファイルをアクティブにしますか?ここでは3つの方法があります。

注:用途向け{プロファイル}の.propertiesリライト優先順位は、この構成ファイルを使用して、application.propertiesよりも大きい加载顺序問題ではありません。また、同じ特性を有する用途向け{プロファイル} .ymlファイルを作成します。

3.6.1方法

構成ファイルの設定で、このアプローチは柔軟ではない、以下実際の開発が使用されます

spring.profiles.active=test复制代码

3.6.2第二の方法

例Mavenの中に包装する際置換プレースホルダ

最初のステップ(package.targetカスタムパラメータ)のプロパティを追加します。

[email protected]@复制代码

第二段階の異なる環境の増加はのpom.xmlに設定を詰め:

<!-- 与Maven build标记并列 -->
<profiles>
    <!-- 开发环境 -->
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <package.target>dev</package.target>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </dependency>
        </dependencies>
    </profile>
    <!-- 生产环境 -->
    <profile>
        <id>prod</id>
        <properties>
            <package.target>prod</package.target>
        </properties>
    </profile>
</profiles>复制代码

上記構成から分かるように、Mavenのは、二つのプロファイル構成:DEV及びPROD、ノーPROD一方(このような製造環境で、使用の開発を外部のTomcatの構成シナリオを使用するなど、埋め込みDEVのTomcatで使用します内部のTomcat)。

第三のステップは、「@ XXX @」、建物内のリソースのMavenプラグインの使用を表現するフィルタのプロパティを変更達成するためにリソースを追加します。

...

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>

<!-- Maven build标记内 -->
<resources>
    <!-- 不加该resource也可以 -->
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <!-- 排除掉src/main/resources下的所有application*.properties文件 -->
            <exclude>application*.properties</exclude>
        </excludes>
    </resource>
    <resource>
        <!-- 指定要处理的资源目录 -->
        <directory>src/main/resources</directory>
        <!-- 是否替换@xx@表示的maven properties属性值 -->
        <filtering>true</filtering>
        <includes>
            <!-- 将文件内容的“@xx@”替换为相应的变量,即package.target -->
            <include>application-${package.target}.properties</include>
        </includes>
    </resource>
</resources>复制代码

第四の工程は、パッケージをコンパイルすることです:

# 根据Maven Profile的 dev 构建环境包
$ mvn clean package -Dmaven.test.skip=true -Pdev复制代码

3.6.3 3つの方法

システム環境変数を設定することにより:

export SPRING_PROFILES_ACTIVE=dev复制代码

3.6.4その他の方法

Javaのコマンドラインモードの設定:

# 方式一
$ java -jar app.jar --spring.profiles.active=dev
# 方式二
$ java -jar -Dspring.profiles.active=dev demo-0.0.1-SNAPSHOT.jar复制代码

注釈方法(@ActiveProfiles単体テストに設けられたコメント春ブーツのテストスタータのみでより有用である/src/test/java使用)。

@ActiveProfiles("dev")复制代码

3.6.5 YML特別な方法

YAMLファイルが実際にあることができる---ドキュメントの一連の別個の線、各ドキュメントは別個に拡張された構成にマッピング解析されます。DEVまたは生産は、環境変数やクラスのコマンドラインモードが指定されているのと同じ方法を作動させます。

# 通用属性
server:
    port: 9000
---
# dev环境下配置
spring:
    profiles: dev
server:
    port: 9001

---
# production生产环境下配置
spring:
    profiles: production
server:
    port: 0复制代码

3.7カスタム属性

Springすでに私たちのためにデフォルトパラメータの多くを提供していますが、我々はまた、独自の設定パラメータを作成することができます。たとえば、我々はapplication.properties次のカスタムプロパティを作成しました:

#random int
app.location-x=${random.int}
app.location-y=${random.int}

#random int with max
app.user-age=${random.int(100)}

#random int range
app.max-users=${random.int[1,10000]}

#random long with max
app.refresh-rate-milli=${random.long(1000000)}

#random long range
app.initial-delay-milli=${random.long[100,90000000000000000]}

#random 32 bytes
app.user-password=${random.value}

#random uuid. Uses java.util.UUID.randomUUID()
app.instance-id=${random.uuid}复制代码

そして、対応するJavaパラメータコンポーネントを作成しますMyAppProperties.java

@Component
@ConfigurationProperties("app")
    public class MyAppProperties {
    private int locationX;
    private int locationY;
    private int userAge;
    private int maxUsers;
    private long refreshRateMilli;
    private long initialDelayMilli;
    private String userPassword;
    private UUID instanceId;
    
    public int getLocationX() {
        return locationX;
    }
    public void setLocationX(int locationX) {
        this.locationX = locationX;
    }
    public int getLocationY() {
        return locationY;
    }
    public void setLocationY(int locationY) {
        this.locationY = locationY;
    }
    public int getUserAge() {
        return userAge;
    }
    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
    public int getMaxUsers() {
        return maxUsers;
    }
    public void setMaxUsers(int maxUsers) {
        this.maxUsers = maxUsers;
    }
    public long getRefreshRateMilli() {
        return refreshRateMilli;
    }
    public void setRefreshRateMilli(long refreshRateMilli) {
        this.refreshRateMilli = refreshRateMilli;
    }
    public long getInitialDelayMilli() {
        return initialDelayMilli;
    }
    public void setInitialDelayMilli(long initialDelayMilli) {
        this.initialDelayMilli = initialDelayMilli;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public UUID getInstanceId() {
        return instanceId;
    }
    public void setInstanceId(UUID instanceId) {
        this.instanceId = instanceId;
    }
    
    @Override
    public String toString() {
        return "MyAppProperties [locationX=" + locationX + ", locationY=" + locationY + ", userAge=" + userAge
                + ", maxUsers=" + maxUsers + ", refreshRateMilli=" + refreshRateMilli + ", initialDelayMilli="
                + initialDelayMilli + ", userPassword=" + userPassword + ", instanceId=" + instanceId + "]";
    }
}复制代码

@ConfigurationPropertiesメモSpring Bootすべての属性と設定ファイルをバインドするには、関連する構成のクラスを宣言します。prefix = "app"prefix=可省略):設定接頭辞書、接頭辞マッピングのすべての属性。@Componentまたは@Configuration:に追加の成分Spring Boot容器は、唯一の容器アセンブリコンポーネントは有効にするように構成されています。

ヒント:あなたがまたできる@Value("${key}")設定ファイルの属性を読み取る、key = propertiesファイルの主要部分は、等号の左側。我々はパラメータを定義するJavaコンポーネントでは、あなたはまた、注射が有効な電子メールアドレスがスローされますされていない場合@emailは、メッセージ変数に追加など、特定のパラメータの主張に注釈を付けることができます。このような注釈も@AssertFalse偽、チェック@AssertTrueパリティ真、@DecimalMax(value=10,inclusive=true)以下、10に等しい包括=真を、ほぼ等しいよりも@DecimalMin(value=,inclusive=)@Max(value=)より小さいまたは等しい値、@Min(value=)より大きいか等しい値、@Past検査日、@Pattern(regex=,flag=)正規@Validateのpoエンティティクラスのように検証します。

最後に、私たちは頼りに参加する必要がありspring-boot-configuration-processor

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 加入spring-boot-configuration-processor -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>复制代码

私たちのカスタム設定を確認します。

@SpringBootApplication
public class Test07HelloworldApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Test07HelloworldApplication.class, args);
        MyAppProperties bean = context.getBean(MyAppProperties.class);
        System.out.println(bean.toString());
    }
}

// output
// MyAppProperties [locationX=1329054364, locationY=1100464591, userAge=99, maxUsers=8007, refreshRateMilli=733281, initialDelayMilli=54489880705550952, userPassword=76aebd15270f7065adf3d31b5a790829, instanceId=681ed3a4-a561-460c-b826-58229c31b055]复制代码

4まとめ

デモ検証上記の実際の内容の最も後、サンプルコードがあってもよいgithub.com/yicm/Spring ...に見出しました。この章では、構成ファイルの詳細内容の詳細が、私たちは、私は、この要約のようなものだったいくつかのポイントがあります。

  • 春ブーツは、デフォルトの設定の多くを提供してくれ、私たちは、設定パラメータのため、これらの値をオーバーライドし、(カバレッジ)を書き換えるためのさまざまな方法を提供し、書き換えモードの間での優先順位であることができます
  • スプリングブートアプリケーションは、異なる位置に設定ファイルをロードすることができるapplication.properties(yml)し、これらの位置は、優先度の順であります
  • それは春ブーツの間のパラメータのプレースホルダで参照することができ、また、コマンドラインパラメータ名によって簡素化することができるプレースホルダ
  • 春ブーツは、カスタムパラメータをサポートすることができます
  • 春のブートは、カスタム設定ファイル名をサポートしています
  • 春のブートコンフィギュレーションスイッチは、することにより、複数のファイルをサポートすることができますapplication-{profile}.properties(yml)プロファイルを活性化し、アクティブプロファイルにはいくつかの方法があります

あなたは上記の概要の具体的な内容を知っている場合は、このブログでは、あなたはほとんど理解する必要があります。

5つの参考文献

  • https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
  • https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-yaml
  • https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
  • https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/api//org/springframework/boot/SpringApplication.html
  • https://docs.spring.io/spring/docs/5.2.1.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html
  • https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests
  • http://www.ruanyifeng.com/blog/2016/07/yaml.html
  • https://yaml.org/spec/1.2/spec.html
  • https://segmentfault.com/a/1190000011770028

この記事では、一部作成され、ソースを示して再現し、歓迎の注意CSDNのfreeapeやマイクロ文字のアプレット小白AI博客マイクロチャネル公共番号小白AIやWebサイトxiaobaiai.net

おすすめ

転載: juejin.im/post/5dd7985a51882573412f78ec