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
。
答案 0 :(得分:2)
以编程方式使用SpEL时,您可以在使用StandardTypeLocator
将包添加到StandardTypeLocator
后,将registerImport()
注入评估上下文。 (这就是在Spring Integration流程中使用SpEL时如何做到这一点)。在SpEL表达式中使用自定义类时,它确实更方便。
我们在twitter endpoints中使用该技术。
使用自定义函数时也一样 - 它们必须在评估上下文中注册。
通过将自定义#{...}
注入应用程序上下文的bean工厂,可以自定义布线bean(BeanExpressionResolver
)时使用的评估上下文。在StandardBeanExpressionResolver
上下文之前,子类customizeEvaluationContext()
并覆盖refresh()
。