Spring Bootの設定値は、定義ファイルである「application.yml」や「application.properties」で定義するが、その設定値による処理の振り分けは@ConditionalOnPropertyアノテーションで定義できる。
今回は、@ConditionalOnPropertyアノテーションを利用したサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。
サンプルプログラムの内容
まず最初に、定義ファイルに「application.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>application.ymlで「demo.test=true」の場合に、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした場合の実行結果は以下の通りで、「DemoTestTrue.java」の実装クラスの呼び出し結果が設定されていることが確認できる。

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

なお、「application.yml」を「application.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アノテーションを利用すればよい。




