【SpringBootの入門から習得まで】第4章 Springbootの設定ファイル

四、Springboot 設定ファイル

4.1 デフォルトの設定ファイル

Springboot は、固定の構成ファイル名を持つグローバル構成ファイルを使用しますapplication

構成ファイルの役割: Springboot の自動構成のデフォルト値を変更します。

構成ファイルの場所: デフォルトではsrc/main/resourcesディレクトリにあります。

application.properties ファイルに次の構成を追加すると、次のようになります。

server.port=8090

プロジェクトを実行すると、実行中のポートが 8090 に調整されていることがわかります。

ここに画像の説明を挿入

4.2ヤムル

Springboot で使用できるプロパティ ファイルに加えて、新しいファイル形式YAMLも使用できます。

4.2.1 はじめに

YAML は、「YAML Ain't a Markup Language」の再帰的な頭字語です (YAML はマークアップ言語ではありません)。この言語が開発されたとき、YAML は実際には「Yet Another Markup Language」の略でした。データ中心で、json、xml などよりも構成ファイルに適しています。

2 つの構成ファイルが同時に構成されている場合、両方とも機能しますが、2 つの構成ファイルが優先されます。

application.properties > applicaton.yml

4.2.2 yml 基本構文

  • キー: 値。キーと値のペアの間にはスペースが必要です (キーが強調表示されます)。
  • 大文字と小文字を区別;
  • 改行とインデントを使用して階層関係を表します。
  • タブはインデントに使用できません。スペースのみ使用できます。
  • 同じレベルの要素が左揃えである限り、インデント時のスペース数の要件はありません。
  • 「#」ポンド記号はコメントを示します。

4.2.3 yml データ構造

4.2.3.1 リテラル値

分割できない単一の値。数値 (number)、文字 (string)、ブール値 (boolean)、日付 (date)、空の値 (null)。

例:

#字面值
number: 123
str: hello
date: 2021/08/16
flag: true
obj: ~

デフォルトでは、文字列に一重引用符または二重引用符は必要ありません。文字列にスペースまたは特殊文字が含まれている場合は、引用符で囲む必要があります。

  • 二重引用符: 文字列内の特殊文字はエスケープされず、特殊文字は表現したい意味として使用されます。
  • 一重引用符: 特殊文字はエスケープされ、特殊文字は最終的には単なる通常の文字列データになります。
  • 単一引用符の中に単一引用符がある場合は、単一引用符を 2 つ続けてエスケープする必要があります。
str1: "how are you"
str2: "how\nare\nyou"
str3: 'hello\n''abc'''

4.2.3.2 配列

順序付けられた一連の値。シーケンス (シーケンス) またはリスト (リスト) とも呼ばれます。

例:

-を持つ配列内の要素を表します。

#数组
array1:
  - java
  - html
  - css
  - js

インライン書き込み:

array2: [tom, jerry, chris]

4.2.3.3 オブジェクト

マッピング、ハッシュ、またはディクショナリとも呼ばれる、キーと値のペアのコレクション。

例:

#对象
student:
  id: 10
  name: 张三
  age: 20
  gender: true
  birth: 1996/12/08
  skill: [java, spring, mysql]

インライン書き込み:

address: {
    
    province: 河南省, city: 郑州市, area: 高新区, street: 迎春街, num: 18号}

4.3 設定ファイルの読み込み

構成はプロジェクト開発でよく使用されます. 構成ファイルには Spring コンポーネントとサードパーティ コンポーネントのデフォルト構成を変更するだけでなく, カスタム構成情報もいくつか書き込まれます. カスタム構成の読み方は?

4.3.1 @値

@Value アノテーション + SpringEL を使用して構成情報を読み取り、 @Value の構成項目で式 ${構成ファイル内のキー名} を使用して読み取ります。

@RestController
public class ReadConfigController {
    
    

    @Value("${number}")
    private Integer number;

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

    @Value("${date}")
    private Date date;

    @Value("${flag}")
    private Boolean flag;

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

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

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

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

    @Value("${array[0]}")
    public String arrayItem;

    @GetMapping("/getValue")
    public String getValue(){
    
    
        System.out.println("数字:" + number);
        System.out.println("字符:" + str);
        System.out.println("日期:" + date);
        System.out.println("布尔:" + flag);
        System.out.println("str1:" + str1);
        System.out.println("str2:" + str2);
        System.out.println("str3:" + str3);
        System.out.println("学生姓名:" + stuName);
        System.out.println("数组元素:" + arrayItem);
        return "ok";
    }

}

アクセス:http://localhost:8090/getValue、コンソール入力結果:

数字:123
字符:hello
日期:Mon Aug 16 00:00:00 CST 2021
布尔:true
str1:how are you
str2:how
are
you
str3:hello\n'abc'
学生姓名:张三
数组元素:java

4.3.2 環境

このメソッドは、Evnironment (環境オブジェクト) を依存関係によって注入し、対応する値を読み取るenv.getProperty("键名")ために。

@Autowired
private Environment env;

@GetMapping("/getEnv")
public String getEnv(){
    
    
    System.out.println("数字:" + env.getProperty("number"));
    System.out.println("字符:" + env.getProperty("str"));
    System.out.println("学生姓名:" + env.getProperty("student.name"));
    System.out.println("学生年龄:" + env.getProperty("student.age"));
    return "ok";
}

アクセス:http://localhost:8090/getEnv、コンソール入力結果:

数字:123
字符:hello
学生姓名:张三
学生年龄:20

4.4 構成バインディング

構成バインディングは、構成ファイルを読み取る方法でもあります。これは、構成ファイルをバッチで読み取ると言えます。Java を使用して構成ファイルの内容を読み取り、すぐに使用できるように JavaBean にカプセル化します。

4.4.1 @ConfigurationProperties + @コンポーネント

特別なアノテーション @ConfigurationProperties を使用する必要があります。これは、yml ファイル内のプレフィックス名の仕様を示す、構成アイテムのプレフィックスを提供する必要があります。

@ConfigurationProperties構成ファイルを読み取るために springboot によって提供されるアノテーションです。

@ConfigurationProperties(prefix = "student")学生のプレフィックスが付いた構成情報を読み取ることを示します。

バインディング クラスを構成します。

@Component
@ConfigurationProperties(prefix = "student")
public class StudentProperties {
    
    

    private Integer id;
    private String name;
    private Integer age;
    private Boolean gender;
    private Date birth;
    private String[] skill;

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Integer getAge() {
    
    
        return age;
    }

    public void setAge(Integer age) {
    
    
        this.age = age;
    }

    public Boolean getGender() {
    
    
        return gender;
    }

    public void setGender(Boolean gender) {
    
    
        this.gender = gender;
    }

    public Date getBirth() {
    
    
        return birth;
    }

    public void setBirth(Date birth) {
    
    
        this.birth = birth;
    }

    public String[] getSkill() {
    
    
        return skill;
    }

    public void setSkill(String[] skill) {
    
    
        this.skill = skill;
    }
}

構成の読み取り:

@Autowired
private StudentProperties studentProperties;

@GetMapping("/readStudent")
public StudentProperties readStudent(){
    
    
    return studentProperties;
}

ここに画像の説明を挿入

4.4.2 @ConfigurationProperties + @EnableConfigurationProperties

@ConfigurationProperties アノテーションを使用して構成を読み取り、構成クラスで @EnableConfigurationProperties アノテーションを使用して構成バインディングを有効にします。

注: このメソッドは、主に WebMvcProperties などのサードパーティの構成バインディング クラスに使用されます。

バインディング クラスを構成します。

@ConfigurationProperties(prefix = "address")
public class AddressProperties {
    
    

    private String province;
    private String city;
    private String area;
    private String street;
    private String num;

    public String getProvince() {
    
    
        return province;
    }

    public void setProvince(String province) {
    
    
        this.province = province;
    }

    public String getCity() {
    
    
        return city;
    }

    public void setCity(String city) {
    
    
        this.city = city;
    }

    public String getArea() {
    
    
        return area;
    }

    public void setArea(String area) {
    
    
        this.area = area;
    }

    public String getStreet() {
    
    
        return street;
    }

    public void setStreet(String street) {
    
    
        this.street = street;
    }

    public String getNum() {
    
    
        return num;
    }

    public void setNum(String num) {
    
    
        this.num = num;
    }
}

構成バインディングは、メイン プログラムまたは構成クラスで有効にできます。

@SpringBootApplication
//启用指定的配置绑定类
@EnableConfigurationProperties({
    
    AddressProperties.class})
public class Springboot03ConfigApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(Springboot03ConfigApplication.class, args);
    }
}

構成の読み取り:

@Autowired
private AddressProperties addressProperties;

@GetMapping("/readAddress")
public AddressProperties readAddress(){
    
    
    return addressProperties;
}

ここに画像の説明を挿入

4.4.3 構成のヒント

通常、クラスと構成ファイルのバインドを読み取るカスタム構成のプロンプトは表示されません. プロンプトが必要な場合は、pom.xml ファイルに Maven の依存関係を追加できます.

<!--配置解析依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Springboot プログラムを再起動した後、yml パーサーを有効にしてから、構成ノードの値を yml ファイルに書き込むと、対応するプロンプトが表示されます。

4.4.4 @Value 取得値と @ConfigurationProperties 取得値の比較

アイテム @ConfigurationProperties @価値
関数 構成ファイルへの属性のバッチ注入 単一指定
結合が緩い (構文が緩い) サポート サポートしません
ゲーム サポートしません サポート
JSR303 データ検証 サポート サポートしません
複合型のカプセル化 サポート サポートしません

提案:

  • 特定のビジネス ロジックの構成ファイルで特定の値のみを取得する必要がある場合は、@Value を使用します。
  • JavaBean が構成ファイルにバインドするように特別に作成されている場合は、 @ConfigurationProperties を直接使用します。
  • ルーズバインディング: https://blog.csdn.net/u011628753/article/details/125431909

4.5 ネイティブ構成ファイル

デフォルトでは、Springboot はプロパティと yaml 形式の構成ファイルのみをサポートし、名前は application. それでもネイティブ構成ファイルを使用する必要がある場合は、次の 2 つの注釈を使用できます。

4.5.1 @ImportResource

@ImportResource アノテーションは、Spring の従来の構成ファイルをインポートして、構成ファイル内の構成コンテンツを有効にすることができます。

豆クラス:

public class Dept {
    
    

    @Override
    public String toString() {
    
    
        return "Dept对象";
    }
}

public class Emp {
    
    

    private Dept dept;

    public void setDept(Dept dept) {
    
    
        this.dept = dept;
    }

    @Override
    public String toString() {
    
    
        return "Emp对象{" +
                "dept=" + dept +
                '}';
    }
}

ネイティブ xml 構成:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dept" class="com.newcapec.bean.Dept"/>
    <bean id="emp" class="com.newcapec.bean.Emp">
        <property name="dept" ref="dept"/>
    </bean>
</beans>

Springboot のメイン プログラム クラス:

Spring の構成ファイルを有効にするには、 @ImportResource アノテーションをメイン プログラム クラス (または構成クラス) に追加する必要があります。

@SpringBootApplication
@EnableConfigurationProperties({
    
    AddressProperties.class})
//让springboot程序读取原生spring配置文件
@ImportResource(locations = {
    
    "classpath:beans.xml"})
public class Springboot03ConfigApplication {
    
    

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

        Dept dept = context.getBean("dept", Dept.class);
        System.out.println(dept);

        Emp emp = context.getBean("emp", Emp.class);
        System.out.println(emp);
    }
}

ここに画像の説明を挿入

4.5.2 @プロパティソース

Springboot 以外のプロパティ ファイルを読み込んで読み込みます。

db.properties ファイル:

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8 
mysql.username=root
mysql.password=123456

バインディング クラスを構成します。

@Component
@ConfigurationProperties(prefix = "mysql")
@PropertySource(value = "classpath:db.properties")
public class MysqlProperties {
    
    

    private String username;
    private String password;
    private String driver;
    private String url;

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public String getDriver() {
    
    
        return driver;
    }

    public void setDriver(String driver) {
    
    
        this.driver = driver;
    }

    public String getUrl() {
    
    
        return url;
    }

    public void setUrl(String url) {
    
    
        this.url = url;
    }
}

構成の読み取り:

@Autowired
private MysqlProperties mysqlProperties;

@GetMapping("/readMysql")
public MysqlProperties readMysql(){
    
    
    return mysqlProperties;
}

4.6 プロファイル

プロファイルは、さまざまな環境でさまざまな構成機能をサポートする Springboot のサポートであり、パラメーターをアクティブにして設定することにより、環境をすばやく切り替えることができます。

4.6.1 複数のプロファイル

メイン構成ファイルを記述する場合、ファイル名は application-{profile}.yml または application-{profile}.properties にすることができ、以下では yml が使用されます。

メイン構成ファイル application.yml:

spring:
  profiles:
    active: dev

開発環境設定ファイル application-dev.yml:

server:
  port: 8081

テスト環境設定ファイル application-test.yml:

server:
  port: 8082

本番環境構成ファイル application-prod.yml:

server:
  port: 8083

4.6.2 yml がマルチドキュメント ブロック モードをサポート

構成ファイルは、複数のドキュメント ブロックを使用して複数の環境を作成することもサポートしています。---(3 つの破線) はドキュメント ブロックを表します。他のドキュメント ブロックを開始するように指定しない場合、最初のドキュメント ブロックがデフォルトで開始されます。

spring:
  profiles:
    active: dev # 指定当前激活的profile

---
#开发profile
server:
  port: 8091
spring:
  profiles: dev #指定属于哪个环境

---
#测试profile
server:
  port: 8092
spring:
  profiles: test #指定属于哪个环境

---
#生产profile
server:
  port: 8093
spring:
  profiles: product  #指定属于哪个环境

spring-profiles プロンプトの非推奨の問題について: https://blog.csdn.net/huang498/article/details/123776406

4.6.3 指定したプロファイルをアクティブ化する

上記のマルチプロファイル構成はすべて、指定されたプロファイルを有効にする必要があります。

4.6.3.1 設定ファイル

メイン構成ファイル application.yml でアクティブ化されます。

spring:
  profiles:
    active: dev

4.6.3.2 コマンドライン

プロジェクトを jar パッケージにパッケージ化し、コマンド ラインから起動します。

java -jar springboot03-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

4.6.3.3 仮想マシンのパラメータ

IDEA の実行/デバッグ構成で VM オプション パラメーターを指定します。

-Dspring.profiles.active=prod

注: -D は固定の文言です。

ここに画像の説明を挿入

4.6.3.4 アプリケーションパラメータ

IDEA の実行 / デバッグ構成でプログラム引数パラメーターを指定します。

--spring.profiles.active=prod

ここに画像の説明を挿入

4.7 構成ファイルのロード場所

Springboot の起動は、Springboot のデフォルト構成ファイルとして、次の場所にある application.properties または application.yml ファイルをスキャンします。

  • file:./config/ (現在のプロジェクト ファイル ディレクトリの config)
  • file:./ (現在のプロジェクト ファイル ディレクトリの下)
  • クラスパス:/config/
  • クラスパス:/

優先度は高から低まであり、優先度の高い構成は優先度の低い構成を上書きします。

Springboot は 4 つの場所すべてからメイン構成ファイルをロードします。補完的な構成は、css のカスケード スタイル シートに似ています。

spring.config.location次の方法で、デフォルトの構成ファイルの場所を変更することもできます。

spring.config.location=d:/application.properties

プロジェクトがパッケージ化された後、コマンド ライン パラメーターの形式を使用して、プロジェクトの開始時に構成ファイルの新しい場所を指定できます。指定された構成ファイルと既定で読み込まれる構成ファイルが連携して、補完的な構成を形成します。

java -jar springboot03-config-0.0.1-SNAPSHOT.jar --spring.config.location=d:/application.properties

4.8 外部構成の読み込み順序

Springboot は、次の場所から構成を読み込むこともできます。優先度は低いものから高いものまであり、優先度の高い構成は優先度の低い構成を上書きし、すべての構成が補完的な構成を形成します。

ここに画像の説明を挿入

  1. SpringApplication.setDefaultProperties で指定されたデフォルト プロパティ。
  2. @Configuration 構成クラスの @PropertySource アノテーション。
  3. jar パッケージ内の application.properties または application.yml (spring.profile を除く) 構成ファイル。
  4. jar パッケージ内の application-{profile}.properties または application-{profile}.yml (spring.profile を含む) 構成ファイル。
  5. jar パッケージ外の application.properties または application.yml (spring.profile なし) 構成ファイル。
  6. jar パッケージ外の application-{profile}.properties または application-{profile}.yml (spring.profile を使用) 構成ファイル。
  7. RandomValuePropertySource構成されたrandom.*プロパティ値。
  8. オペレーティング システムの環境変数。
  9. Java システム プロパティ (System.getProperties())。
  10. java:comp/env からの JNDI プロパティ。
  11. サーブレット コンテキスト オブジェクトの初期化パラメーター。
  12. サーブレット オブジェクトの初期化パラメーター。
  13. SPRING_APPLICATION_JSON のプロパティ (環境変数またはシステム プロパティに組み込まれた JSON ファイル)。
  14. コマンドライン引数。
  15. テスト中のpropertiesプロパティ。@SpringBootTestアプリケーションの特定の部分の注釈とテストに使用できます。
  16. テストに関する注意事項@TestPropertySource
  17. devtools がアクティブな場合の$HOME/.config/spring-bootディレクトリ内の devtools グローバル設定プロパティ。

外部構成ファイルの公式リファレンス ドキュメント

4.9 デバッグモード

Springboot のデバッグ モードはデフォルトで false であり、true に設定して、Springboot がデバッグ モードでレポート情報を生成できるようにすることができます。

注: 構成は、できるだけプロファイルの前に配置する必要があります。

debug: true

ここに画像の説明を挿入

4.10 アプリケーション共通設定項目一覧

Springboot 構成ファイルには多くの構成項目がありますが、プログラマーが使用できる構成項目はどれですか?

公式文書参照

おすすめ

転載: blog.csdn.net/ligonglanyuan/article/details/126126366