[英]How to customize the SpEL parser in Spring?
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
。
以编程方式使用SpEL时,可以在使用registerImport()
将包添加到StandardTypeLocator
之后,将StandardTypeLocator
注入评估上下文。 (这就是在Spring Integration流程中使用SpEL时的方式)。 在SpEL表达式中使用自定义类时,确实使它更加方便。
我们在Twitter端点中使用该技术。
使用自定义函数时也是一样-它们必须在评估上下文中注册。
您可以通过将自定义BeanExpressionResolver
注入应用程序上下文的bean工厂中,来定制在连接bean( #{...}
)时使用的评估上下文。 子类StandardBeanExpressionResolver
并在对上下文进行refresh()
之前重写customizeEvaluationContext()
。
为了补充加里的答案:
您可以通过将自定义BeanExpressionResolver注入应用程序上下文的bean工厂中,来定制在连接bean(#{...})时使用的评估上下文。 子类StandardBeanExpressionResolver,并在对上下文进行refresh()之前重写customizeEvaluationContext()。
这可以通过编写如下所示的BeanFactoryPostProcessor来实现:
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.setBeanExpressionResolver(new CustomBeanExpressionResolver());
}
}
如果您将BeanFactoryPostProcessor注册为Bean,它将由Spring自动获取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.