Spring @Valueアノテーション

Springの@Valueアノテーションは、変数やメソッド引数にデフォルト値を割り当てるために使用されます。@Valueアノテーションを使用して、Springの環境変数およびシステム変数を読み取ることもできます。Springの@Valueアノテーションは、SpELもサポートしています。いくつかの@Valueアノテーションの使用例を見てみましょう。

Spring @Value – デフォルト値

@Valueアノテーションを使用して、クラスのプロパティにデフォルト値を割り当てることができます。

@Value("Default DBConfiguration")
private String defaultName;

@Valueアノテーションの引数は文字列のみですが、Springは指定された型に変換しようとします。以下のコードは正常に動作し、ブール値と整数値を変数に割り当てます。

@Value("true")
private boolean defaultBoolean;

@Value("10")
private int defaultInt;

Spring @Value – Spring環境プロパティ

@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;

もしキーがSpringの環境プロパティで見つからない場合、プロパティの値は${APP_NAME_NOT_FOUND}になります。キーがSpringの環境プロパティに存在しない場合に割り当てられるデフォルト値を指定することもできます。

@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;

Spring @Value – システム環境

Springの環境が作成されると、すべてのシステム環境変数が読み取られ、プロパティとして保存されます。そのため、@Valueアノテーションを使用してシステム変数も割り当てることができます。

@Value("${java.home}")
private String javaHome;
	
@Value("${HOME}")
private String homeDir;

Spring @Value – SpEL

@ValueアノテーションではSpring Expression Language(SpEL)も使用することができます。そのため、SpELを使用してJavaのホームシステムプロパティを読み取ることもできます。

@Value("#{systemProperties['java.home']}")
private String javaHome;

Spring @Valueメソッドとともに使用する

@Value注釈がメソッドに見つかると、SpringコンテキストはすべてのSpring設定とビーンがロードされる際にそれを呼び出します。メソッドに複数の引数がある場合、各引数の値はメソッドの注釈からマップされます。異なる引数に異なる値が必要な場合は、引数と直接@Value注釈を使用できます。

@Value("Test")
public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test' 
@Value("Test")
public void printValues(String s, @Value("Data") String v){}
// s=Test, v=Data

Spring @Valueの例

単純なSpringアプリケーションを作成しましょう。@Value注釈を使用してプロパティを読み取り、それらをクラス変数に割り当てます。Mavenプロジェクトを作成し、Spring Coreの依存関係を追加してください。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

最終的なプロジェクト構造は以下の画像のようになります。各コンポーネントを一つずつ見ていきます。変数の値を@Value注釈を介して注入するコンポーネントクラスを作成します。

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Value;

public class DBConnection {

	@Value("${DB_DRIVER_CLASS}")
	private String driverClass;
	@Value("${DB_URL}")
	private String dbURL;
	@Value("${DB_USERNAME}")
	private String userName;
	@Value("${DB_PASSWORD}")
	private char[] password;

	public DBConnection() {
	}

	public void printDBConfigs() {
		System.out.println("Driver Class = " + driverClass);
		System.out.println("DB URL = " + dbURL);
		System.out.println("User Name = " + userName);

		// 本番環境では以下を決して行わないでください :D
		System.out.println("Password = " + String.valueOf(password));
	}
}

次に、Configurationクラスを作成し、DBConnectionクラスの@Beanメソッドを提供する必要があります。

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound = true)
public class DBConfiguration {

	@Value("Default DBConfiguration")
	private String defaultName;

	@Value("true")
	private boolean defaultBoolean;

	@Value("10")
	private int defaultInt;

	@Value("${APP_NAME_NOT_FOUND:Default}")
	private String defaultAppName;

	// @Value("#{systemProperties['java.home']}")
	@Value("${java.home}")
	private String javaHome;

	@Value("${HOME}")
	private String homeDir;

	@Bean
	public DBConnection getDBConnection() {
		DBConnection dbConnection = new DBConnection();
		return dbConnection;
	}

	@Value("Test")
	public void printValues(String s, @Value("another variable") String v) {
		System.out.println("Input Argument 1 =" + s);
		System.out.println("Input Argument 2 =" + v);

		System.out.println("Home Directory = " + homeDir);
		System.out.println("Default Configuration Name = " + defaultName);
		System.out.println("Default App Name = " + defaultAppName);
		System.out.println("Java Home = " + javaHome);
		System.out.println("Boolean = " + defaultBoolean);
		System.out.println("Int = " + defaultInt);

	}

}

以下は、アノテーションベースのSpringコンテキストを作成しているメインクラスです。

package com.journaldev.spring;

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();
		System.out.println("Refreshing the spring context");
		DBConnection dbConnection = context.getBean(DBConnection.class);

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

}

このクラスを実行すると、以下の出力が生成されます。

Input Argument 1 =Test
Input Argument 2 =another variable
Home Directory = /Users/pankaj
Default Configuration Name = Default DBConfiguration
Default App Name = Default
Java Home = /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Boolean = true
Int = 10
Refreshing the spring context
Driver Class = com.mysql.jdbc.Driver
DB URL = jdbc:mysql://localhost:3306/Test
User Name = journaldev
Password = journaldev

構成クラスprintValues()が、コンテキストがユーザリクエストに対応する準備ができる前に呼び出されていることに注意してください。これでSpring @Valueアノテーションの例は終了です。例のコードはGitHubリポジトリからダウンロードできます。

Spring @Valueアノテーションプロジェクト

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