6.4 Bean定义时使用表达式

无论XML还是注解类型的Bean定义都可以使用SpEL表达式。在两种方式下定义的表达式语法都是一样的,即:#{ }

6.4.1 XML类型的配置

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>

在下面的例子中systemProperties 事先已被定义好,因此表达式中可以直接使用。注意:在已定义的变量前无需加#

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

你还可以通过Name注入的方式使用其他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>

6.4.2 基于注解的配置
@Value可以在属性字段,方法和构造器变量中使用,指定一个默认值。

下面的例子中给属性字段设置默认值:

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

通过Set方法设置默认值:

  1. public static 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. }

使用Autowired注解的方法和构造器也可以使用@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. @Autowired
  5. public MovieRecommender(CustomerPreferenceDao customerPreferenceDao,
  6. @Value("#{systemProperties['user.country']}") String defaultLocale) {
  7. this.customerPreferenceDao = customerPreferenceDao;
  8. this.defaultLocale = defaultLocale;
  9. }
  10. // ...
  11. }