Spring @Value annotation at the field or method/constructor parameter level is used to inject a value. @Value annotation in Spring can be used in the following ways-
- Directly to inject a value at the field, method or constructor level.
- Using @Value annotation you can also assign a value by reading it from a properties file or you can also read a system property.
- You can also use this annotation with a SpEL expression to get the value.
Spring @Value annotation to inject value
You can assign a default value to a field. Though the annotation takes only String type as value but it can convert it to the appropriate type.
@Component
public class Person {
@Value("SomeName")
private String name;
@Value("999")
private int age;
@Value("true")
private boolean flag;
..
..
}
As you can see using @Value annotation value is assigned to int and boolean field too apart from a String field.
@Value annotation with methods
If you use @Value annotation with the method all the arguments will be assigned with the value provided with the annotation.
@Value("hello")
public void displayValues(String a, String b) {
System.out.println(a);
System.out.println(b);
}
Here both a and b arguments will have the assigned values as hello.
To avoid that same assignment you can use @Value annotation directly with method parameter.
@Value("hello")
public void displayValues(String a, @Value("World") String b) {
System.out.println(a);
System.out.println(b);
}
Now a will have hello as value where as b will have world as value.
Spring @Value with properties file
Injecting values to the fields using @Value by reading them from properties file is a scenario which you may use. To add a Properties file to Spring’s Environment @PropertySource annotation is used.
For example there is db.properties file saved at location /src/main/resources/ so that it is on the classpath and using the values in this properties file you want to configure a Apache DBCP datasource.
db.propertiesdb.url=jdbc:oracle:thin:@localhost:1521/XEPDB1 db.user=test db.password=test db.driver-class-name=oracle.jdbc.driver.OracleDriverDBConfiguration.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;
}
}
Class with main method to run the example.
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();
}
}
Output
Driver class Name- oracle.jdbc.driver.OracleDriver URL- jdbc:oracle:thin:@localhost:1521/XEPDB1 User- testSetting default value
You can also provide a default value for properties that might not be defined in the properties file.
@Value("${db.poolsize:10}")
private int initialPoolSize;
If db.poolsize property is found then the value associated with the property is assigned to the field initialPoolSize otherwise 10 is assigned.
Accessing system variables using @Value annotation
Spring framework reads all the system variables and store them as properties so you can also assign system variables using @Value.
@Value("${username}")
private String userName;
@Value("${number_of_processors}")
private int numberOfProcessors;
@Value("${temp}")
private String temp;
Spring @Value with SpEL
Another use case for the usage of @Value is using it with Spring Expression Language (SpEL).
In SpEL there are two variables "systemProperties" and "systemEnvironment" that allows us to access information from system properties and environment variables.
- systemProperties– A java.util.Properties object to provide information about the local system.
- systemEnvironment– A java.util.Properties object retrieving environment specific properties from the OS.
Injecting system properties Java home and user directory.
@Value ("#{systemProperties['java.home']}")
private String javaHome;
@Value ("#{systemProperties['user.dir']}")
private String userDir;
Injecting system environment variables.
@Value("#{ systemEnvironment['USERNAME'] }")
private String userName;
@Value("#{ systemEnvironment['number_of_processors'] ?: '4'}")
private int numberOfProcessors;
@Value("#{systemEnvironment['TEMP'] }")
private String temp;
For other examples using @Value annotation and SpEL please check this post- Spring Expression Language (SpEL) Tutorial
That's all for the topic Spring @Value Annotation. If something is missing or you have something to share about the topic please write a comment.
You may also like
- Spring @Component, @Service, @Repository, @Controller Annotations
- Spring Boot Application Using Spring Initializr
- Spring Boot Microservices Eureka + Ribbon
- Java Callable And Future With Examples
- Java ListIterator With Examples
- Covariant Return Type in Java
- Write to Excel File in Java Using Apache POI
- super() in Python With Examples
No comments:
Post a Comment