Java 多个相同类型的Spring组件\Bean

Java 多个相同类型的Spring组件\Bean,java,spring-boot,Java,Spring Boot,我有一个基类Foo和多个继承自它的类 到目前为止,我只需要一个 所以我就这么做了: @Autowired private List<Foo> foos; @Autowired 私人名单; 但情况已经发生了变化,我希望生成每种类型的多个对象(即Foo1的x实例,Foo2的y实例等) 如何使用Spring Boot实现这一点 注意:我真的不需要将它填充到列表中 编辑: 我将进一步解释我面临的问题。每个类代表一种任务类型(它是一个可运行的)。每个任务都有固定数量的线程。我想为每个线程

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

到目前为止,我只需要一个

所以我就这么做了:

@Autowired 
private List<Foo> foos;
@Autowired
私人名单;
但情况已经发生了变化,我希望生成每种类型的多个对象(即
Foo1
x
实例,
Foo2
y
实例等)

如何使用Spring Boot实现这一点

注意:我真的不需要将它填充到列表中

编辑:

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


所以我的问题是:如何利用弹簧来实现这一目标?当我每次任务只需要一个实例时,这很容易(请参阅
列表
示例)

如果我正确理解了您的问题,那么您需要一个bean的多个实例,然后您需要向原型声明该bean的范围,因为默认情况下,spring将它们设置为单实例(每个容器一个bean)。要创建bean原型,只需将此注释
@Scope(“PROTOTYPE”)
添加到类中。 以下是一些深入的参考:

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

它使用一个工厂来保存
Foo
的所有依赖项,我们使
Foo
不再是一个springbean。因此,我们不依赖Spring来实例化
Foo
n
实例,相反,我们可以通过编程来决定要创建多少实例

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

赞成的意见:
  • 可以通过编程方式创建
    n
    实例。(可通过属性设置、可计算、可注入…)
  • 我们不使用spring来决定创建了多少实例
  • (可能还有更多,但目前我想不出更多)
反对的论点:
  • 为要创建的每种类型创建一个新类(工厂)的开销很大

实际答案 1.创建一个接口 这将用于创建类型的
n
实例:

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

听起来很有趣。您将如何生成每个bean?假设您将这些bean注入到singleton中,此链接可能有助于进一步澄清:这有什么意义?你想实现什么?作为初学者,我想享受Spring的组件扫描功能。
Foo
的每个实例都“附加”到一个线程上。这对我来说没有任何意义。@Lino,正如我解释的,每个类都是一种任务类型。每个任务都有多个线程(固定数量)。我想为每个线程“分配”一个新实例(这是一个可运行的实例)。谢谢Lino!但是是的,我同意这会让你的代码膨胀classes@yasecospring已经让您创建了比您希望的更多的类,所以这可能不是一个很大的缺点;)@yaseco实际上,在进一步研究之后,spring已经实现了类似的功能:
// 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);
    }
}
@Service
class MyService{
    private final FooFactory fooFactory;

    @Autowired
    public MyService(FooFactory fooFactory){
        this.fooFactory = fooFactory;
    }

    public void doSomething(){
        // can of course be generated with a normal for loop too
        List<Foo> foos = IntStream.range(0, 10)
            .mapToObj(i -> fooFactory.create())
            .collect(Collectors.toList());

        // do something with 10 foo instances   
    }
}