如何在Spring中自定义SpEL解析器?

时间:2014-09-23 08:35:37

标签: java spring spring-el

SpEL是Spring提供的优秀功能,但有时候,使用SpEL调用类构造函数有点单调乏味,这是一个例子

<bean id="plainPojo" class="myPackage.PoJo">
    <property name="date" value="#{new java.util.Date()}"/>
</bean>

为了启动Date实例,我必须包含Date类的完全限定名称。有没有办法可以定义自定义SpEL解析器,这样我就不必编写我想要使用的类的完全限定名称?

顺便说一下,写这样的SpEL是可以的:

<bean id="plainPojo" class="myPackage.PoJo">
    <property name="name" value="#{new String('myName')}"/>
</bean>

String类在java.lang包中,所以我认为Spring框架使用的默认SpEL解析器已包含路径java.lang

1 个答案:

答案 0 :(得分:2)

以编程方式使用SpEL时,您可以在使用StandardTypeLocator将包添加到StandardTypeLocator后,将registerImport()注入评估上下文。 (这就是在Spring Integration流程中使用SpEL时如何做到这一点)。在SpEL表达式中使用自定义类时,它确实更方便。

我们在twitter endpoints中使用该技术。

使用自定义函数时也一样 - 它们必须在评估上下文中注册。

通过将自定义#{...}注入应用程序上下文的bean工厂,可以自定义布线bean(BeanExpressionResolver)时使用的评估上下文。在StandardBeanExpressionResolver上下文之前,子类customizeEvaluationContext()并覆盖refresh()