导入要在Spring XML和SpEL

时间:2017-03-06 20:11:22

标签: java spring spring-el

我很高兴将SpEL用于XML文件来配置Spring Beans。

但是,我想缩短这样的表达方式:

<constructor-arg value = "#{ T(org.apache.commons.io.IOUtils).toString ( new java.io.FileReader ( './test.dat' ) ) }" />

有没有办法像org.apache.commons.io.IOUtils.toString()(或至少IOUtils类)那样的静态导入方法,因为它可以在Java中使用?这也可以在常规XML值中使用(例如,在<bean class = "..." >中)吗?

更新

下面的Artem's answer是一个很好的,特别是定义实例化实用程序类的新bean的方法。也许值得强调的是,即使IOUtils有私有构造函数,Spring也允许你这样做。

1 个答案:

答案 0 :(得分:1)

该功能称为SpEL-function

public class SpELFunctionBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver() {

            @Override
            protected void customizeEvaluationContext(StandardEvaluationContext evalContext) {
                evalContext.registerFunction("ioToString",
                        IOUtils.class.getDeclaredMethod("toString", new Class[] { FileReader.class }));
            }

        });
    }

}

并在您的上下文中将其注册为bean。

最后你的表达式如下:

"#{ #ioToString( new java.io.FileReader ( './test.dat' ) ) }"

<强>更新

另一种解决方案就像使用这些实用方法的普通bean一样:

<bean id="myUtility" class="...">
...

"#{ myUtility.toString('./test.dat') }"

并执行该类中已有的所有硬逻辑。