Spring Bootの設定値は、定義ファイルである「application.yml」や「application.properties」で定義するが、その設定値はJavaのプログラムから取得することもできる。
今回は、@Valueアノテーションを利用して単独の設定値を取得する方法と、@ConfigurationPropertiesアノテーションを利用して複数の設定値をまとめて取得する方法の両方を試してみたので、そのサンプルプログラムを共有する。
なお、@Valueアノテーション・@ConfigurationPropertiesアノテーションについては下記サイトを参照のこと。
https://qiita.com/cfg17771855/items/905da3100ae99c5197f0
前提条件
下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。
サンプルプログラムの内容
まず最初に、定義ファイルに「application.yml」を利用して作成した、サンプルプログラムの構成は以下の通り。
なお、上記の赤枠のうち、「build.gradle」は今回変更したプログラムで、他は新規で作成したプログラムとなる。
まず、build.gradleは以下の通りで、lombokの設定を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' //lombokを利用できる設定 compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' } |
また、application.ymlは以下の通りで、ポート番号とデータベース接続情報を設定している。
1 2 3 4 5 6 7 8 9 | server: port: 8084 # DB接続情報 spring: datasource: url: jdbc:oracle:thin:@localhost:1521:xe username: USER01 password: USER01 driverClassName: oracle.jdbc.driver.OracleDriver |
単独の設定値を取得するプログラムは以下の通り。@Valueアノテーションにより、application.ymlに定義したポート番号が取得できるようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class DemoGetPortNum { /** ポート番号 */ @Value("${server.port}") private String portNum; /** * ポート番号を取得する * @return ポート番号 */ public String getPortNum(){ return portNum; } } |
また、複数の設定値をまとめて取得するプログラムは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package com.example.demo; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @ConfigurationProperties(prefix="spring.datasource") @Component @Data public class DemoGetDataSource { /** URL */ private String url; /** ユーザー名 */ private String username; /** パスワード */ private String password; /** ドライバクラス名 */ private String driverClassName; /** * データベース接続情報を取得する * @return データベース接続情報 */ public String getDataSource(){ return "url=" + url + ", username=" + username + ", password=" + password + ", driverClassName=" + driverClassName; } } |
prefixで指定した配下にある設定値であるデータベース接続情報が、url, username等のインスタンス変数に設定される。また、url, username等のインスタンス変数の設定をするSetter/Getterメソッドを利用できるようにするため、lombokの@Dataアノテーションを付与している。
さらに、コントローラクラスのプログラムは以下の通りで、前述の単独の設定値(ポート番号)を取得するプログラム・複数の設定値(データベース接続情報)をまとめて取得するプログラムをそれぞれ呼び出している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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 { /** * ポート番号取得処理 */ @Autowired private DemoGetPortNum demoComponent; /** * データベース接続情報取得処理 */ @Autowired private DemoGetDataSource demoGetDataSource; @RequestMapping("/") public String index(Model model){ //ポート番号を取得し、modelオブジェクトに設定 String portNum = demoComponent.getPortNum(); model.addAttribute("portNum", portNum); //データベース接続情報を取得し、modelオブジェクトに設定 String dataSource = demoGetDataSource.getDataSource(); model.addAttribute("dataSource", dataSource); return "index"; } } |
また、HTMLファイルの内容は以下の通りで、取得したポート番号とデータベース接続情報を表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>index page</title> </head> <body> 取得した定義ファイルの値は以下の通り。 <br/><br/> ポート番号の取得結果: <p th:text="${portNum}">ここに取得したポート番号が設定されます</p> <br/><br/> データベース接続情報の取得結果: <p th:text="${dataSource}">ここに取得したデータベース接続情報が設定されます</p> <br/><br/> </body> </html> |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-get-properties/demo
Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした場合の実行結果は以下の通り。
なお、「application.yml」を「application.properties」に変更した場合も同様の結果となる。
この場合のサンプルプログラムの構成は以下の通り。
また、application.propertiesの内容は以下の通り。
1 2 3 4 5 6 | 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 |
要点まとめ
- 定義ファイルである「application.yml」や「application.properties」の設定値を、Javaプログラムから取得するには、@Valueアノテーションや@ConfigurationPropertiesアノテーションを利用すればよい。