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;
もし、春の環境プロパティ内でキーが見つからなかった場合、そのプロパティ値は${APP_NAME_NOT_FOUND}となります。春の環境プロパティからキーが欠落している場合、デフォルト値を割り当てることができます。
@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;
Springの@Valueアノテーション – システム環境
Springの環境が準備されたとき、すべてのシステム環境変数を読み込み、プロパティとして保存します。したがって、@Value注釈を使用してシステム変数を割り当てることもできます。
@Value("${java.home}")
private String javaHome;
@Value("${HOME}")
private String homeDir;
スプリングの@Value – SpEL
私たちは@Valueアノテーションと一緒にSpring Expression Languageを使うこともできます。したがって、SpELを使ってJavaホームシステムプロパティを読むこともできます。
@Value("#{systemProperties['java.home']}")
private String javaHome;
Springの@Valueを使ったメソッドとしてのパラフレーズは次の通りです:
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>
package com.scdev.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);
// Never do below in production environment :D
System.out.println("Password = " + String.valueOf(password));
}
}
今、我々は Configuration クラスを作成し、DBConnection クラスのために @Bean メソッドを提供する必要があります。
package com.scdev.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.scdev.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.scdev.spring");
context.refresh();
System.out.println("Refreshing the spring context");
DBConnection dbConnection = context.getBean(DBConnection.class);
dbConnection.printDBConfigs();
// close the spring context
context.close();
}
}
クラスを実行すれば、次の出力が生成されます。
Input Argument 1 =Test
Input Argument 2 =another variable
Home Directory = /Users/scdev
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 = scdev
Password = scdev
コンテキストがユーザーのリクエストを処理する準備が整う前に、ConfigurationクラスのprintValues()メソッドが呼び出されていることに注意してください。これがSpringの@Valueアノテーションの例です。私たちのGitHubリポジトリからサンプルコードをダウンロードできます。
Springの@Valueアノテーションプロジェクト