繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM