Java 在春季将原型列表注入单例bean

Java 在春季将原型列表注入单例bean,java,spring,dependency-injection,Java,Spring,Dependency Injection,春天这里需要一些帮助。 在我们的项目中,我们使用XML和注释配置(Spring4.1) 最近我面临着以下任务: 我有一个范围原型的bean列表,它们都实现了相同的接口 此外,我还有一个具有execute方法的单例bean。在方法内部,bean应该访问这些原型bean的列表 每次执行“execute”方法时,我都希望能够访问这些原型bean的不同实例)。 在singleton中,我没有预先知道的整个bean列表,所以我只需要@Autowire整个集合,以便加载应用程序上下文中已知的每个bean实现

春天这里需要一些帮助。 在我们的项目中,我们使用XML和注释配置(Spring4.1) 最近我面临着以下任务:

我有一个范围原型的bean列表,它们都实现了相同的接口

此外,我还有一个具有
execute
方法的单例bean。在方法内部,bean应该访问这些原型bean的列表

每次执行“execute”方法时,我都希望能够访问这些原型bean的不同实例)。 在singleton中,我没有预先知道的整个bean列表,所以我只需要
@Autowire
整个集合,以便加载应用程序上下文中已知的每个bean实现

interface SomeInterface {

}


class PrototypeBean1 implements SomeInterface {
  ...
}

class PrototypeBean2 implements SomeInterface {
  ...
}


class MySingletonBean {

   @Autowire (????)
   List<SomeInterface> allPrototypeBeansLoadedIntoTheApplicationContext;

   public void execute() {
      // this one is called many times,
      // so I would like to get different lists of    
      //"allPrototypeBeansLoadedIntoTheApplicationContext"
      // with different actuals bean upon every invocation
      // how do I achieve this???
   }

} 
interface-SomeInterface{
}
类PrototypeBean1实现了SomeInterface{
...
}
类PrototypeBean2实现了一些接口{
...
}
类MySingletonBean{
@自动布线(??)
列出加载到应用程序上下文中的所有原型;
public void execute(){
//这个叫很多次,,
//所以我想得到不同的
//“将所有原型加载到应用程序上下文”
//每次调用时使用不同的实际值bean
//我如何做到这一点???
}
} 
所以我的问题是:实现这一点最干净的方法是什么?理想情况下,我希望得到一个与spring接口完全解耦的解决方案(比如注入ApplicationContext/BeanFactory之类的东西) 我不介意在这里使用Aop(性能并没有那么重要),但我不能完全相信一个干净的spring解决方案。因此,任何帮助都将不胜感激


提前感谢

我一直在尝试用Spring实现类似的目标,在阅读Spring文档后,使用或(with)出现并看起来很有希望。 然而,在尝试了这两种方法后,结果都令人沮丧。这两种方法都不支持返回列表中的bean。我得到了一个例外:

没有“java.util.List”类型的合格bean可用

显然,Spring将返回类型视为常规对象

因此,最终我的解决方案是创建一个新对象,将列表包装为返回类型

@Component
@Scope("prototype")
public class ProcessorList
{
    private List<Processor> processors;

    public ProcessorList(List<Processor> processors)
    {
        this.processors = processors;
    }

    public List<Processor> getProcessors()
    {
        return processors;
    }

    public void setProcessors(List<ChangeSetProcessor> processors)
    {
        this.processors = processors;
    }
}
然后使用ServiceLocatorFactoryBean注册工厂:

@Configuration
public class MyConfiguration{
    @Bean
    public FactoryBean serviceLocatorFactoryBean()
    {
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        factoryBean.setServiceLocatorInterface(ProcessorFactory.class);
        return factoryBean;
    }

}
最后实现接口并确保用@Scope(“prototype”)标记它们

现在,每次使用factory方法时都会得到新实例

如果您愿意,它类似于使用方法注入

@Configuration
public class MyConfiguration{
    @Bean
    public FactoryBean serviceLocatorFactoryBean()
    {
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        factoryBean.setServiceLocatorInterface(ProcessorFactory.class);
        return factoryBean;
    }

}