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
请注意,配置类printValues()
在我们的上下文准备好为用户请求提供服务之前被调用。关于Spring@Value注解的示例就介绍到这里,您可以从我们的GitHub代码库下载示例代码。
Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation