Expressions in Bean Definitions

你可以使用 SpEL 表达式与基于 XML 或基于注解的配置元数据来定义 BeanDefinition 实例。在这两种情况下,定义表达式的语法都是 #{ <表达式字符串> }的形式。

XML 配置

一个属性或构造函数参数值可以通过使用表达式来设置,如下例所示:

  1. <bean id="numberGuess" class="org.spring.samples.NumberGuess">
  2. <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
  3. <!-- other properties -->
  4. </bean>

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

下面的例子显示了对作为 SpEL 变量的 systemProperties bean 的访问:

  1. <bean id="taxCalculator" class="org.spring.samples.TaxCalculator">
  2. <property name="defaultLocale" value="#{ systemProperties['user.region'] }"/>
  3. <!-- other properties -->
  4. </bean>

注意,你不必在这里用 #符号给预定义的变量加前缀。

你也可以通过名称来引用其他的 Bean 属性,如下例所示:

  1. <bean id="numberGuess" class="org.spring.samples.NumberGuess">
  2. <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
  3. <!-- other properties -->
  4. </bean>
  5. <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
  6. <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
  7. <!-- other properties -->
  8. </bean>

注解配置

为了指定一个默认值,你可以在字段、方法和方法或构造函数参数上放置 @Value注解。

下面的例子设置了一个字段的默认值:

  1. package cn.mrcode.study.springdocsread.web;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @author mrcode
  6. */
  7. @Component
  8. public class DemoService {
  9. // user.region 这个 key 有可能是空的,所以在测试的时候换另外一个 容易看出来效果
  10. // @Value("#{ systemProperties['user.region'] }")
  11. @Value("#{ systemProperties['user.country'] }")
  12. private String defaultLocale;
  13. }

下面的例子是等价的,但在一个属性设置方法上:

  1. public class PropertyValueTestBean {
  2. private String defaultLocale;
  3. @Value("#{ systemProperties['user.region'] }")
  4. public void setDefaultLocale(String defaultLocale) {
  5. this.defaultLocale = defaultLocale;
  6. }
  7. public String getDefaultLocale() {
  8. return this.defaultLocale;
  9. }
  10. }

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

  1. public class SimpleMovieLister {
  2. private MovieFinder movieFinder;
  3. private String defaultLocale;
  4. @Autowired
  5. public void configure(MovieFinder movieFinder,
  6. @Value("#{ systemProperties['user.region'] }") String defaultLocale) {
  7. this.movieFinder = movieFinder;
  8. this.defaultLocale = defaultLocale;
  9. }
  10. // ...
  11. }
  1. public class MovieRecommender {
  2. private String defaultLocale;
  3. private CustomerPreferenceDao customerPreferenceDao;
  4. public MovieRecommender(CustomerPreferenceDao customerPreferenceDao,
  5. @Value("#{systemProperties['user.country']}") String defaultLocale) {
  6. this.customerPreferenceDao = customerPreferenceDao;
  7. this.defaultLocale = defaultLocale;
  8. }
  9. // ...
  10. }