关注弹簧工厂模式(following this great blog)后,我创建了一个工厂类
@Component
public interface FooFactory {
Foo getFoo(String fooType);
}
public abstract class Foo {
private Integer calc
public Integer getCalc(){return calc}
public void setCalc(Integer calc){
this.calc = calc)
}
}
@Component("bar")
public class Bar extends Foo {
@Overrride
public void setCalc(Integer calc){
this.calc = calc*10)
}
@Component("bazz")
public class Bazz extends Foo {
@Override
public void setCalc(Integer calc){this.calc = calc+10)
}
}
在我的主要班级
private List<Foo> createFoo(){
List<Foo> fooList = ArrayList<Foo>(3)
Foo bar1 = fooFactory.getFoo("bar")
bar1.setCalc(10)
Foo bar2 = fooFactory.getFoo("bar")
bar2.setCalc(20)
Foo bazz1 = fooFactory.getFoo("bazz")
barzz1.setCalc(30)
fooList.add(bar1)
fooList.add(bar2)
fooList.add(bazz1)
for (Foo f:fooList)
System.out.println(f.getCalc());
}
我得到的结果是
200
200
40
而不是我预期的
100
200
40
表示列表中的第一个对象被同一类型的第二个对象覆盖。 我该如何解决?
我确实需要以这种方式创建它们。因为我实际上是根据用户输入在运行时将它们添加到列表中
context xml:
<bean class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean" id="fooFactory">
<property name="serviceLocatorInterface" value="com.myname.FooFactory">
</property></bean>
答案 0 :(得分:2)
您必须使用@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Component("bar")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Bar extends Foo {
@Overrride
public void setCalc(Integer calc){this.calc = calc*10)
}
@Component("bazz")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Bazz extends Foo {
@Override
public void setCalc(Integer calc){this.calc = calc+10)
}
ServiceLocatorFactoryBean ...它们通常用于原型bean,即用于为每次调用返回新实例的工厂方法。
答案 1 :(得分:1)
andresoviedo's answer is right
更多解释:
ServiceLocatorFactoryBean
只是普通bean工厂的代理。
因此原型/单例范围的处理方式与正常注入相同。
因此,当您期望Prototype范围bean(这是您所期望的(两个具有不同值的相同类型的bean))时,您需要配置bean属于此范围。所以你需要将@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
添加到你的两个bean中。