Spring Boot 定義ファイル読込

定義ファイルの設定値により実行する処理を振り分けてみた

Spring Bootの設定値は、定義ファイルである「application.yml」や「application.properties」で定義するが、その設定値による処理の振り分けは@ConditionalOnPropertyアノテーションで定義できる。

今回は、@ConditionalOnPropertyアノテーションを利用したサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの内容

まず最初に、定義ファイルに「application.yml」を利用して作成した、サンプルプログラムの構成は以下の通り。
サンプルプログラムの構成_yml
なお、上記の赤枠が、今回新規で作成したプログラムとなる。

まず、application.ymlの内容は以下の通り。今回は、「demo.test」の設定値により処理の振り分けを行う。

server:
  port: 8084
# DB接続情報
spring:
  datasource:
    url: jdbc:oracle:thin:@localhost:1521:xe
    username: USER01
    password: USER01
    driverClassName: oracle.jdbc.driver.OracleDriver
# プロパティ値分岐確認用の設定値
demo:
  test: true



次に、テスト値を取得するインタフェースとその実装クラスの内容は以下の通り。

package com.example.demo;

public interface DemoTest {

    /**
     * テスト値を取得する
     * @return 取得したテスト値
     */
    String gestTestValue();

}
package com.example.demo;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

//demo.test=trueの場合に呼ばれる処理
@ConditionalOnProperty(name = "demo.test", havingValue = "true")
@Component
public class DemoTestTrue implements DemoTest {

    /**
     * {@inheritDoc}
     */
    @Override
    public String gestTestValue() {
        return "demo.test.value = true";
    }

}

package com.example.demo;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

//demo.test=falseの場合に呼ばれる処理
@ConditionalOnProperty(name = "demo.test", havingValue = "false")
@Component
public class DemoTestFalse implements DemoTest {

    /**
     * {@inheritDoc}
     */
    @Override
    public String gestTestValue() {
        return "demo.test.value = false";
    }

}

「DemoTestFalse.java」「DemoTestTrue.java」が、インタフェース「DemoTest,java」の実装クラスになる。「demo.test」の設定値がtrueの場合は「DemoTestTrue.java」の実装クラスが、falseの場合は「DemoTestFalse.java」の実装クラスが、それぞれ呼ばれるようになっている。



コントローラクラスのプログラムは以下の通り。この中で「DemoTest,java」の実装クラスを呼び出している。

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DemoController {

    /**
     * demo.testの値取得処理
     */
    @Autowired
    private DemoTest demoTest;

    @RequestMapping("/")
    public String index(Model model){
        //demo.testの値を取得し、modelオブジェクトに設定
        String testValue = demoTest.gestTestValue();
        model.addAttribute("testValue", testValue);
        return "index";
    }
}

さらに、HTMLファイルの内容は以下の通り。取得したテスト値を表示している。

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>index page</title>
</head>
<body>
取得した値は以下の通り。
<br/><br/>
demo.testの値:
<p th:text="${testValue}">ここに取得したdemo.testの値が設定されます</p><br/><br/>
</body>
</html>
サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

application.ymlで「demo.test=true」の場合に、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした場合の実行結果は以下の通りで、「DemoTestTrue.java」の実装クラスの呼び出し結果が設定されていることが確認できる。
サンプルプログラムの実行結果true

また、application.ymlで「demo.test=false」とした場合の、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした場合の実行結果は以下の通りで、「DemoTestFalse.java」の実装クラスの呼び出し結果が設定されていることが確認できる。
サンプルプログラムの実行結果false

なお、「application.yml」を「application.properties」に変更した場合も同様の結果となる。この場合のサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成_properties

また、application.propertiesの内容は以下の通り。

server.port = 8084
# DB接続情報
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=USER01
spring.datasource.password=USER01
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
# プロパティ値分岐確認用の設定値
demo.test = true

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-divide-by-prop/demo

要点まとめ

  • 定義ファイルである「application.yml」や「application.properties」の設定値による処理の振り分けには、@ConditionalOnPropertyアノテーションを利用すればよい。