我很高兴将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也允许你这样做。
答案 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') }"
并执行该类中已有的所有硬逻辑。