【问题标题】:How to customize the SpEL parser in Spring?Spring中如何自定义SpEL解析器?
【发布时间】:2014-09-23 08:35:37
【问题描述】:

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 解析器遵循默认的 java 约定,并声明 java.lang 包中的所有内容都可用(您不会在导入语句中看到 java.lang 包)。另外,为什么要使用 XML 进行编程,在这种情况下,它似乎并没有真正有用,因为您可能希望将其放在普通的 java 代码中。
  • 这只是一个例子,我想做的是在启动一个bean时调用一些自定义函数。也许这就是我要找的docs.spring.io/spring-integration/reference/html/spel.html
  • 在下面查看我的答案。

标签: java spring spring-el


【解决方案1】:

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

我们使用twitter endpoints 中的技术。

使用自定义函数时也是如此——它们必须在评估上下文中注册。

您可以通过将自定义 BeanExpressionResolver 注入应用程序上下文的 bean 工厂来自定义连接 bean (#{...}) 时使用的评估上下文。继承 StandardBeanExpressionResolver 并在 refresh() 设置上下文之前覆盖 customizeEvaluationContext()

【讨论】:

    【解决方案2】:

    补充加里的回答:

    您可以通过将自定义 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 会自动获取它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-10
      • 2019-02-26
      • 1970-01-01
      • 2022-12-14
      • 2017-07-20
      • 1970-01-01
      • 2018-06-09
      • 2017-08-01
      相关资源
      最近更新 更多