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;