Spring Boot 定義ファイル読込

定義ファイルの設定値をJavaプログラムから取得してみた

Spring Bootの設定値は、定義ファイルである「application.yml」や「application.properties」で定義するが、その設定値はJavaのプログラムから取得することもできる。

今回は、@Valueアノテーションを利用して単独の設定値を取得する方法と、@ConfigurationPropertiesアノテーションを利用して複数の設定値をまとめて取得する方法の両方を試してみたので、そのサンプルプログラムを共有する。

なお、@Valueアノテーション・@ConfigurationPropertiesアノテーションについては下記サイトを参照のこと。
https://qiita.com/cfg17771855/items/905da3100ae99c5197f0

前提条件

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

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

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

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

まず、build.gradleは以下の通りで、lombokの設定を追加している。

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は以下の通りで、ポート番号とデータベース接続情報を設定している。

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に定義したポート番号が取得できるようになっている。

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;
    }

}



また、複数の設定値をまとめて取得するプログラムは以下の通り。

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アノテーションを付与している。



さらに、コントローラクラスのプログラムは以下の通りで、前述の単独の設定値(ポート番号)を取得するプログラム・複数の設定値(データベース接続情報)をまとめて取得するプログラムをそれぞれ呼び出している。

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ファイルの内容は以下の通りで、取得したポート番号とデータベース接続情報を表示している。

<!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」に変更した場合も同様の結果となる。
この場合のサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成2

また、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

要点まとめ

  • 定義ファイルである「application.yml」や「application.properties」の設定値を、Javaプログラムから取得するには、@Valueアノテーションや@ConfigurationPropertiesアノテーションを利用すればよい。