多个相同类型的Spring Components \ Bean

时间:2018-12-17 14:50:24

标签: java spring-boot

我有一个基类textField和多个继承自它的类。

直到现在我只需要其中一个

所以我刚做了:

let action = UIAlertAction(title: "ENTER", style: .default) { _ in
    if let textField = alert.textFields?[0] {
        self.teamNameLabel.text = textField.text!
    }
}

但是情况已经变了,我想生成每种类型的多个对象(即Foo的{​​{1}}实例,@Autowired private List<Foo> foos; 的{​​{1}}实例等)

如何使用Spring Boot做到这一点?

注意:我并不是真的需要将其填充到列表中。

编辑:

我将进一步解释我面临的问题。每个类代表一种任务(它是x)。每个任务都有固定数量的线程。我想为每个线程实例化一个新对象。

所以我的问题是:如何利用Spring来实现这一目标?返回时,当我只需要一个实例来完成每个任务时,这很容易(请参见Foo1示例)

2 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,则需要一个bean的多个实例,则需要将该bean的范围声明为PROTOTYPE,因为默认情况下spring使它们成为SINGLETON(每个容器一个bean)。要使您的bean成为PROTOTYPE,只需要将此注释@Scope("prototype")添加到类中即可。 这里有一些深入的参考:https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

HTH

答案 1 :(得分:2)

TL; DR;

我提出了一个解决方案,其中包括一些工作,但在大多数情况下更干净。

它使用了一个工厂,该工厂拥有Foo的所有依赖关系,我们使Foo不再是spring bean。因此,我们不依赖Spring实例化n的{​​{1}}实例,而是可以通过编程方式确定要创建多少个实例。

这当然有一些优点和缺点:

专业版:

  • 可以以编程方式创建Foo实例。 (可以通过属性设置,可以计算,可以注入...)
  • 我们不使用spring来决定创建多少个实例
  • (还有更多可能,但目前我想不出来)

Con:

  • 您需要为每种要创建的类型创建一个新类(工厂)的开销

实际答案

1。创建一个界面

这将用于创建您的n类型的实例:

n

2。创建实现

必须对要构造的每种类型都执行此操作。此外,每个创建的实现都必须声明为Spring Bean:

interface Factory<T> {
    T create();
}

3。注入工厂

这是在我们要创建// Our object we want to create class Foo { private final Dependency1 d1; private final Dependency2 d2; public Foo(Dependency1 d1, Dependency2 d2){ this.d1 = d1; this.d2 = d2; } // methods of foo } // our factory for the object @Component class FooFactory implements Factory<Foo>{ private final Dependency1 d1; private final Dependency2 d2; @Autowired public FooFactory(Dependency1 d1, Dependency2 d2){ this.d1 = d1; this.d2 = d2; } @Override public Foo create(){ return new Foo(d1, d2); } } 的{​​{1}}实例的服务中完成的:

n