导入 类 以用于 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 中已有的所有硬逻辑。
我很高兴在 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 = "..." >
中)?
更新
下面的
该功能称为 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 中已有的所有硬逻辑。