添加spring组件以列出相同类型的覆盖组件

时间:2014-10-24 06:44:31

标签: java spring spring-mvc

关注弹簧工厂模式(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>

2 个答案:

答案 0 :(得分:2)

您必须使用@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)

}

请参阅http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html

  

ServiceLocatorFactoryBean ...它们通常用于原型bean,即用于为每次调用返回新实例的工厂方法。

答案 1 :(得分:1)

andresoviedo's answer is right

更多解释:

ServiceLocatorFactoryBean只是普通bean工厂的代理。 因此原型/单例范围的处理方式与正常注入相同。

因此,当您期望Prototype范围bean(这是您所期望的(两个具有不同值的相同类型的bean))时,您需要配置bean属于此范围。所以你需要将@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)添加到你的两个bean中。