Spring是否允许在非抽象中转换抽象bean?

use*_*818 1 java spring javabeans

我的应用可以在不同的环境中运行.我需要为每个环境配置MY数据模型.数据模型使用Spring bean构建.

我使用Spring 3.0.5,所以我无法有条件地加载资源.我有这个:

<bean id="Template1" class="...
..............
</bean>

<bean id="Template2" class="...
..............
</bean>

<bean id="Template3" class="...
..............
</bean>
................

<bean id="Factory" ...>
<propety name="type"><value>${app.type}</value></property>
<property>
 <map>
   <entry key="Temlate1" value-ref="Template1">
   <entry key="Temlate2" value-ref="Template1">
   <entry key="Temlate3" value-ref="Template1">

..................
Run Code Online (Sandbox Code Playgroud)

我工厂创建的真正的豆子:

<bean id="real" factory="Factory" factory-method="getInstance"
 <constructor-arg>Factory</.....
 .............
 </bean>
Run Code Online (Sandbox Code Playgroud)

Java代码:

class Factory {
private Map<String, Object> templateBeans;

 Object getInstance(String name) {
  return templateBeans.get(name);
 ...........
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式声明抽象模板bean?因为我对记忆有很大的问题.是否有另一种方法可以在版本3.1之前的Spring中有条件地实例化不同的bean?最好只使用EL,因为我无法访问bean的Java代码,因为它们来自第三方库.

Pab*_*jim 5

我没有试过这个,但我相当肯定你可以使用bean别名.

首先将所有模板bean声明为lazy,这样它们就不会在启动时实例化.

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
Run Code Online (Sandbox Code Playgroud)

然后使用带有变量的bean别名指向真实的变量:

<alias name="real" alias="${beanForEnvironment}"/>
Run Code Online (Sandbox Code Playgroud)

请参阅我的答案,了解如何为每个环境很好地加载属性:

来自另一家酒店的物业占位符位置