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表达式语言。所以我们也可以使用SpEL读取java home系统属性。

@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

春季@Value示例

让我们创建一个简单的Spring应用程序,在其中使用@Value注解来读取属性并将它们赋值给类变量。创建一个Maven项目并添加Spring核心依赖项。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>
Spring Value Annotation Example
package com.Olivia.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));
	}
}

现在我们需要创建一个配置类,并为DBConnection类提供一个@Bean方法。

package com.Olivia.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.Olivia.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.Olivia.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/Olivia
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 = Olivia
Password = Olivia

请注意,在我们的上下文准备好为用户请求提供服务之前,Configuration类的printValues()方法被调用。这就是Spring @Value注解示例的全部内容

发表回复 0

Your email address will not be published. Required fields are marked *