按照 spring 工厂模式 ( 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>
最佳答案
您必须使用 @Scope(BeanDefinition.SCOPE_PROTOTYPE)
注释您的 bean
@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...They will typically be used for prototype beans, i.e. for factory methods that are supposed to return a new instance for each call.
关于java - 添加 spring 组件列表覆盖相同类型的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542787/