导入 类 以用于 Spring XML 和 SpEL

Import of classes to be used in Spring XML and SpEL

我很高兴在 XML 文件中使用 SpEL 来配置 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 class)这样的静态导入方法,就像在 Java 中一样?这在常规 XML 值中是否也可能(例如,在 <bean class = "..." > 中)?

更新

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

该功能称为 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') }"

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