Spring Bootの設定値は、定義ファイルである「application.yml」や「application.properties」で定義するが、その設定値による処理の振り分けは@ConditionalOnPropertyアノテーションで定義できる。
今回は、@ConditionalOnPropertyアノテーションを利用したサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。
サンプルプログラムの内容
まず最初に、定義ファイルに「application.yml」を利用して作成した、サンプルプログラムの構成は以下の通り。
なお、上記の赤枠が、今回新規で作成したプログラムとなる。
まず、application.ymlの内容は以下の通り。今回は、「demo.test」の設定値により処理の振り分けを行う。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
次に、テスト値を取得するインタフェースとその実装クラスの内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 | package com.example.demo; public interface DemoTest { /** * テスト値を取得する * @return 取得したテスト値 */ String gestTestValue(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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」の実装クラスを呼び出している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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ファイルの内容は以下の通り。取得したテスト値を表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!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の内容は以下の通り。
1 2 3 4 5 6 7 8 | 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アノテーションを利用すればよい。