gpt4 book ai didi

java - 使用 SpEL 表达式和 PropertyPlaceHolder 设置 Spring bean 类名

转载 作者:搜寻专家 更新时间:2023-11-01 01:46:09 25 4
gpt4 key购买 nike

更新:截至 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com