Bean 定义中的表达式

你可以将 SpEL 表达式与配置元数据一起使用,以定义 bean 实例。在这两种情况下, 定义表达式的语法形式为 #{ <expression string> }

应用程序上下文中的所有 bean 都可以作为预定义变量使用,变量名为其常见的 bean 名称。 这包括标准上下文 bean,如 environment(类型为 infra.core.env.Environment) 以及用于访问运行时环境的 systemPropertiessystemEnvironment(类型为 Map<String, Object>)。

要指定默认值,可以将 @Value 注解放在字段、方法以及方法或构造函数参数上(或 XML 等效项)。

下例设置字段的默认值:

public class FieldValueTestBean {

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

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

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

请注意,这里不需要在预定义变量前加上 # 符号。

下例显示了等效的属性 setter 方法:

public class PropertyValueTestBean {

  private String defaultLocale;

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

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

自动装配的方法和构造函数也可以使用 @Value 注解,如下例所示:

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;
  }

  // ...
}

你还可以按名称引用其他 bean 属性,如下例所示:

public class ShapeGuess {

  private double initialShapeSeed;

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

  public double getInitialShapeSeed() {
    return initialShapeSeed;
  }
}