Spring @Value批注
在字段或者方法/构造函数参数级别的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;

