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
我們還可以使用 Spring 表達式語言與@Value註釋。因此,我們也可以使用 SpEL 讀取 Java 主目錄系統屬性。
@Value("#{systemProperties['java.home']}")
private String javaHome;
Spring @Value與方法
當在方法上找到@Value註釋時,Spring上下文將在加載所有Spring配置和bean時調用它。 如果方法有多個參數,則每個參數值都從方法註釋中映射。 如果我們希望為不同的參數使用不同的值,那麼我們可以直接使用@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核心依賴項。
<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));
}
}
現在我們必須創建一個配置類並為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
請注意,Configuration類別printValues()
在我們的上下文準備好為用戶請求提供服務之前被調用。有關Spring @Value註釋的示例,您可以從我們的GitHub存儲庫中下載示例代碼。
Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation