Expressions in Bean Definitions

You can use SpEL expressions with configuration metadata for defining bean instances. In both cases, the syntax to define the expression is of the form #{ <expression string> }.

All beans in the application context are available as predefined variables with their common bean name. This includes standard context beans such as environment (of type cn.taketoday.core.env.Environment) as well as systemProperties and systemEnvironment (of type Map<String, Object>) for access to the runtime environment.

To specify a default value, you can place the @Value annotation on fields, methods, and method or constructor parameters (or XML equivalent).

The following example sets the default value of a field:

public class FieldValueTestBean {

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

  public void setDefaultLocale(String defaultLocale) {
    this.defaultLocale = defaultLocale;
  }

  public String getDefaultLocale() {
    return this.defaultLocale;
  }
}

Note that you do not have to prefix the predefined variable with the # symbol here.

The following example shows the equivalent but on a property setter method:

public class PropertyValueTestBean {

  private String defaultLocale;

  @Value("#{ systemProperties['user.region'] }")
  public void setDefaultLocale(String defaultLocale) {
    this.defaultLocale = defaultLocale;
  }

  public String getDefaultLocale() {
    return this.defaultLocale;
  }
}

Autowired methods and constructors can also use the @Value annotation, as the following examples show:

public class MovieFinder {
}

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  private String defaultLocale;

  @Autowired
  public void configure(MovieFinder movieFinder,
      @Value("#{ systemProperties['user.region'] }") String defaultLocale) {
    this.movieFinder = movieFinder;
    this.defaultLocale = defaultLocale;
  }

	// ...
}
public class CustomerPreferenceDao {
}

public class MovieRecommender {

  private String defaultLocale;

  private CustomerPreferenceDao customerPreferenceDao;

  public MovieRecommender(CustomerPreferenceDao customerPreferenceDao,
          @Value("#{systemProperties['user.country']}") String defaultLocale) {
    this.customerPreferenceDao = customerPreferenceDao;
    this.defaultLocale = defaultLocale;
  }

  // ...
}

You can also refer to other bean properties by name, as the following example shows:

public class ShapeGuess {

  private double initialShapeSeed;

  @Value("#{ numberGuess.randomNumber }")
  public void setInitialShapeSeed(double initialShapeSeed) {
    this.initialShapeSeed = initialShapeSeed;
  }

  public double getInitialShapeSeed() {
    return initialShapeSeed;
  }
}