6.4 Bean定义时使用表达式

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

6.4.1 XML类型的配置

Bean属性或者构造函数使用表达式的方式如下:

<bean id="numberGuess" class="org.spring.samples.NumberGuess"> 
    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> 

    <!-- other properties --> 
</bean> 

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

<bean id="taxCalculator" class="org.spring.samples.TaxCalculator"> 
    <property name="defaultLocale" value="#{ systemProperties['user.region'] }"/> 

    <!-- other properties --> 
</bean> 

你还可以通过Name注入的方式使用其他Bean的属性,例如:

<bean id="numberGuess" class="org.spring.samples.NumberGuess"> 
    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> 

    <!-- other properties --> 
</bean> 

<bean id="shapeGuess" class="org.spring.samples.ShapeGuess"> 
    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/> 

    <!-- other properties --> 
</bean> 

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

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

public static class FieldValueTestBean 

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

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

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

} 

通过Set方法设置默认值:

public static class PropertyValueTestBean 

    private String defaultLocale; 

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

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

} 

使用Autowired注解的方法和构造器也可以使用@Value注解.

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 MovieRecommender { 

    private String defaultLocale; 

    private CustomerPreferenceDao customerPreferenceDao; 

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

    // ... 
}