java - 添加 spring 组件列表覆盖相同类型的组件

标签 java spring spring-mvc

按照 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)

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

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/

相关文章:

java - 如何避免在 Int Array 中获得相同的数字?

java - 为什么我尝试在 Spring Boot 应用程序上配置数据库连接时会出现此异常?创建名称为 'dataSource' 的 bean 时出错

javascript - 为什么我在服务器客户端状态下得到 406 Not Acceptable ,甚至我的 spring Controller 也没有调用?

java - 为什么需要 EventSourcingHandler(在聚合对象中)?

java - HBase 中事务的模拟

java - 将异常传递给该方法

spring - 我可以使用InputStreamResource将图像作为ByteArray返回到Spring应用程序吗?

java - CORS 阻止了 Angular 7 和 Spring 5

java - Spring Data返回空元素的List,但List有很多元素

java - spring中如何在html和jsp页面之间导航