Spring @PropertySource

Springの@PropertySourceアノテーションは、プロパティファイルをSpringの環境に提供するために使用されます。このアノテーションは、@Configurationクラスと共に使用されます。SpringのPropertySourceアノテーションは繰り返し可能であり、1つのConfigurationクラスに複数のPropertySourceを持つことができます。この機能は、Java 8以降のバージョンを使用している場合に利用できます。

SpringのPropertySourceの例

簡単なSpringアプリケーションを通じて、プロパティファイルからデータベースの設定詳細を読み取り、データベース接続を作成します。データベースのいくつかのメタデータ情報をコンソールに出力します。シンプルなMavenプロジェクトを作成し、SpringとMySQLの依存関係を追加します。他のデータベースを使用することもできますが、設定を適宜変更してください。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.46</version>
</dependency>

以下の画像は、プロジェクトの最終構造を示しています。必要なコンポーネントを1つずつ説明します。ここに、データベース接続を作成するためのクラスがあります。

package com.journaldev.spring;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {

	private String driverClass;
	private String dbURL;
	private String userName;
	private char[] password;
	private Connection con;

	public DBConnection(String driverClass, String dbURL, String userName, char[] password) {
		this.driverClass = driverClass;
		this.dbURL = dbURL;
		this.userName = userName;
		this.password = password;
	}

	public Connection getConnection() {
		if (this.con != null)
			return con;

		Connection con = null;
		try {
			System.out.println("Creating DB Connection");
			Class.forName(driverClass);
			con = DriverManager.getConnection(dbURL, userName, String.valueOf(password));
			System.out.println("Successfully Created DB Connection");
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
		this.con = con;
		return con;
	}

	public void close() {
		System.out.println("DBConnection close called");
		if (this.con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

注意:実世界のアプリケーションを作成している場合は、Spring ORMを使用できます。これにより、Springがデータベース接続の管理を担当し、ビジネスロジックの記述に集中することができます。さて、Springの設定クラスを作成しましょう。ここでは、PropertySourceアノテーションを使用します。

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {

	@Autowired
    Environment env;
	
	@Bean
    public DBConnection getDBConnection() {
		System.out.println("Getting DBConnection Bean for App: "+env.getProperty("APP_NAME"));
		DBConnection dbConnection = new DBConnection(env.getProperty("DB_DRIVER_CLASS"), env.getProperty("DB_URL"), env.getProperty("DB_USERNAME"), env.getProperty("DB_PASSWORD").toCharArray());
        return dbConnection;
    }
	
}

Springの環境に複数のプロパティファイルを読み込むことに注目してください。次に、これらのプロパティファイルの内容を見てみましょう。db.properties

#MYSQL データベースの設定
DB_DRIVER_CLASS=com.mysql.jdbc.Driver
DB_URL=jdbc:mysql://localhost:3306/Test
DB_USERNAME=journaldev
DB_PASSWORD=journaldev

root.properties

APP_NAME=PropertySource Example

メインクラスを作成し、データベースの詳細を取得しましょう。

package com.journaldev.spring;

import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringMainClass {

	public static void main(String[] args) throws SQLException {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.scan("com.journaldev.spring");
		context.refresh();

		DBConnection dbConnection = context.getBean(DBConnection.class);

		Connection con = dbConnection.getConnection();

		System.out.println(con.getMetaData().getDatabaseProductName());
		System.out.println(con.getMetaData().getDatabaseProductVersion());

		// Springのコンテキストを閉じる
		context.close();
	}

}

上記のクラスをJavaアプリケーションとして実行すると、次の出力が生成されます。

Getting DBConnection Bean for App: PropertySource Example
Creating DB Connection
Successfully Created DB Connection
MySQL
5.7.18
DBConnection close called

可読性を向上させるために、Springがコンソールに出力するデバッグメッセージを削除しました。

Spring @PropertySource複数のファイル – @PropertySources

設定クラスに複数のプロパティファイルを読み込む別の方法があります。

@PropertySources({
@PropertySource("classpath:db.properties"),
@PropertySource("classpath:root.properties")})
public class DBConfiguration {
}

Java 8以降、PropertySourceアノテーションは繰り返し可能になりました。以前のJavaバージョンでは、@PropertySourcesを使用して複数のプロパティファイルを設定クラスに提供する方法でした。

Spring PropertySourceの値の上書き

複数のプロパティファイルをSpring環境にロードすることができます。複数のファイルに同じキーが存在する場合、最後にロードされたプロパティファイルが以前の値を上書きします。したがって、プロパティの値が思わしくない場合は、同じキーが他のプロパティファイルに存在するかどうか、およびこれらのプロパティファイルの読み込み順序を確認してください。

Spring PropertySourceの外部ファイル

時には、構成ファイルが特定の場所に存在し、プロジェクトのクラスパスの一部ではないことがあります。PropertySourceを設定して、ファイルシステムからプロパティファイルを読み込むこともできます。

@PropertySource("file:/Users/pankaj/db.properties")

Spring PropertySourceの環境変数

上記の設定では、外部の場所からプロパティファイルを読み取るための構成がローカルシステムでは動作することに注意してくださいが、他の人やサーバーでは動作しません。また、PropertySourceでシステム変数を読み取ることもできますので、以下の設定はすべての人に対して動作します。

@PropertySource("file:${HOME}/db.properties")

Spring PropertySourceはFileNotFoundExceptionを無視します

プロパティファイルが見つからない場合、FileNotFoundExceptionが発生します。アプリケーションがデフォルトの値でも動作できる場合、例外をスローしたくない場合があります。ファイルが見つからない場合に例外をスローしないようにするために、PropertySourceのignoreResourceNotFoundtrueに設定することで、Springフレームワークに伝えることができます。

@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)

以上がSpring PropertySourceの例です。ソースコードとMavenプロジェクトはGitHubリポジトリからチェックアウトできます。

Spring PropertySourceプロジェクト

Source:
https://www.digitalocean.com/community/tutorials/spring-propertysource