更新:截至 2016 年 12 月 9 日的决议摘要
根据下面@altazar 的回答,this is now possible从 Spring 4.2 开始!
截至 2012 年 3 月 29 日的旧决议摘要
截至目前,Spring SpEL 无法在 class
中执行 <bean>
的属性.
原始问题:
我正在尝试实现动态 class
Spring bean 的属性,最终使用 PropertyPlaceHolder
的组合设置属性和 SpEL 表达式。目的是选择要实例化的类的生产版本或调试版本。它不起作用,我想知道是否有可能实现。
到目前为止,我有以下内容:
平面属性文件:
is.debug.mode=false
Spring XML 配置:
<bean id="example"
class="#{ ${is.debug.mode} ?
com.springtest.ExampleDebug :
com.springtest.ExampleProd}"
/>
Spring bootstrap Java代码:
// Get basic ApplicationContext - DO NOT REFRESH
FileSystemXmlApplicationContext applicationContext = new
FileSystemXmlApplicationContext
(new String[] {pathSpringConfig}, false);
// Load properties
ResourceLoader resourceLoader = new DefaultResourceLoader ();
Resource resource = resourceLoader.getResource("file:" + pathProperties);
Properties properties = new Properties();
properties.load(resource.getInputStream());
// Link to ApplicationContext
PropertyPlaceholderConfigurer propertyConfigurer =
new PropertyPlaceholderConfigurer() ;
propertyConfigurer.setProperties(properties) ;
applicationContext.addBeanFactoryPostProcessor(propertyConfigurer);
// Refresh - load beans
applicationContext.refresh();
// Done
Example example = (Example) applicationContext.getBean("example");
错误信息(为清楚起见删除了很多空格):
Caused by: java.lang.ClassNotFoundException:
#{ true ? com.springtest.ExampleDebug : com.springtest.ExampleProd}
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
. . .
正如您在消息中的“true
”看到的那样,is.debug.mode
属性已成功加载并替换。但是其他事情出了问题。这是我在 Java 中的引导序列吗?或者 XML 中的 SPeL 语法?还是其他问题?
顺便说一句,我知道新的 3.1 配置文件功能,但出于各种原因我想通过 SPeL 执行此操作。我还意识到我正在使用基于文件系统的上下文和路径 - 我也有理由这样做。
最佳答案
您可以使用 factoryBean 完成您想要的:
<bean id="example" class="MyFactoryBean">
<property name="class" value="#{ ${is.debug.mode} ? com.springtest.ExampleDebug : com.springtest.ExampleProd}"/>
</bean>
其中 MyFactoryBean 是返回指定类实例的普通 FactoryBean 实现。
关于java - 使用 SpEL 表达式和 PropertyPlaceHolder 设置 Spring bean 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9907845/