Spring @Value批注

时间:2020-01-09 10:44:36  来源:igfitidea点击:

在字段或者方法/构造函数参数级别的Spring @Value批注用于注入值。 Spring中的@Value注释可以通过以下方式使用:

  • 直接在字段,方法或者构造函数级别注入值。
  • 使用@Value批注,我们还可以通过从属性文件中读取值来分配值,也可以读取系统属性。
  • 我们还可以将此注释与SpEL表达式一起使用以获取值。

Spring @Value注释以注入值

我们可以为字段分配默认值。尽管注释仅将String类型作为值,但可以将其转换为适当的类型。

@Component
public class Person {
	@Value("SomeName")
	private String name;
	@Value("999")
	private int age;
	@Value("true")
	private boolean flag;
	..
	..

}

如我们所见,使用@Value批注将值分配给int和boolean字段,而不是String字段。

@Value注释和方法

如果对方法使用@Value批注,则将为所有参数分配批注提供的值。

@Value("hello")
public void displayValues(String a, String b) {
	System.out.println(a);
	System.out.println(b);
}

在这里,a和b参数都将被分配为hello。

为了避免相同的分配,我们可以直接将@Value注释与方法参数一起使用。

@Value("hello")
public void displayValues(String a, @Value("World") String b) {
	System.out.println(a);
	System.out.println(b);
}

现在,a将具有问候作为值,而b将具有世界作为值。

Spring @Value与属性文件

我们可以使用通过从属性文件中读取@Value来将值注入字段的方法。要将属性文件添加到Spring的Environment @PropertySource批注中。

例如,有一个db.properties文件保存在/ src / main / resources /位置,因此它位于类路径上,并使用此属性文件中的值来配置Apache DBCP数据源。

db.properties

db.url=jdbc:oracle:thin:@localhost:1521/XEPDB1
db.user=test
db.password=test
db.driver-class-name=oracle.jdbc.driver.OracleDriver

DBConfifuration.java

import org.apache.commons.dbcp2.BasicDataSource;
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("dbConfig")
@PropertySource(value="classpath:properties/db.properties")
public class DBConfiguration {
  @Value("${db.driver-class-name}")
  private String driverClassName;
  @Value("${db.url}")
  private String url;
  @Value("${db.user}")
  private String userName;
  @Value("${db.password}")
  private String pwd;
    
  @Bean
  public BasicDataSource dataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName(driverClassName);
    ds.setUrl(url);
    ds.setUsername(userName);
    ds.setPassword(pwd);
    return ds;
  }
}

使用main方法的类来运行示例。

public class App {
  public static void main(String[] args) {
    AbstractApplicationContext context = new AnnotationConfigApplicationContext(DBConfiguration.class);
    //ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml");
    BasicDataSource ds = context.getBean("dataSource", BasicDataSource.class);
    System.out.println("Driver class Name- " + ds.getDriverClassName());
    System.out.println("URL- " + ds.getUrl());
    System.out.println("User- " + ds.getUsername());
    context.close();
  }
}

输出:

Driver class Name- oracle.jdbc.driver.OracleDriver
URL- jdbc:oracle:thin:@localhost:1521/XEPDB1
User- test

设定默认值
我们还可以为属性文件中未定义的属性提供默认值。

@Value("${db.poolsize:10}")
private int initialPoolSize;

如果找到db.poolsize属性,则将与该属性关联的值分配给字段initialPoolSize,否则分配10.

使用@Value批注访问系统变量

Spring框架读取所有系统变量并将其存储为属性,因此我们也可以使用@Value分配系统变量。

@Value("${username}")
private String userName;

@Value("${number_of_processors}")
private int numberOfProcessors;

@Value("${temp}")
private String temp;

SpEL的Spring @Value

使用@Value的另一个用例是将其与Spring Expression Language(SpEL)一起使用。

在SpEL中,有两个变量" systemProperties"和" systemEnvironment"使我们能够从系统属性和环境变量访问信息。

  • systemProperties –一个java.util.Properties对象,用于提供有关本地系统的信息。

  • systemEnvironment –一个java.util.Properties对象,可从OS检索特定于环境的属性。

注入系统属性Java主目录和用户目录。

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

@Value ("#{systemProperties['user.dir']}")
private String userDir;

注入系统环境变量。

@Value("#{ systemEnvironment['USERNAME'] }")
private String userName;

@Value("#{ systemEnvironment['number_of_processors'] ?: '4'}")
private int numberOfProcessors;

@Value("#{systemEnvironment['TEMP'] }")
private String temp;