当前位置: 首页 > 知识库问答 >
问题:

在Spring中将原型列表注入Singleton bean

邰勇军
2023-03-14

Spring在这里需要一些帮助。在我们的项目中,我们使用XML和注释配置(Spring 4.1) 最近我遇到了以下任务:

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

此外,我有一个单独的bean,它有< code>execute方法。在方法内部,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???
   }

} 

所以我的问题是:实现这个最干净的方法是什么?理想情况下,我希望得到一个与spring接口完全解耦的解决方案(比如注入ApplicationContext/BeanFactory之类的东西)。我不介意在这里使用Aop(性能不是那么重要),但是我真的不能接受一个干净的spring解决方案。所以任何帮助都会被感激。

先谢谢了

共有1个答案

赵朝
2023-03-14

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

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

显然Spring将返回类型视为常规Object。

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

@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;
    }
}

然后为列表对象创建一个工厂类:

@Component
public interface ProcessorFactory
{
    ProcessorList getProcessorList();
}

然后使用 ServiceLocatorFactoryBean 注册工厂:

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

}

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

现在,每次使用工厂方法时,您都会获得新实例!

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

 类似资料:
  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 我使用和注释来注入一个原型bean。 然而,注入bean的行为类似于单例bean。有没有办法在mockito中注入一个原型范围bean? 我正在使用运行JUnit,并使用运行初始化模拟。

  • 我正在使用Spring3中的查找方法注入将原型bean注入到单例bean中,如这里的Spring文档中所述。在我的原型bean中,我对ApplicationContext.xml中声明的另一个bean有依赖关系。查找方法注入似乎工作正常,因为我的原型bean被注入到我的单例bean中,然而,原型的依赖项根本没有被注入。当通过查找方法返回原型时,依赖关系是否可以以正常的方式注入到原型bean中?如果

  • 我有一个用于原型bean的FactoryBean,如下所示: 我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过,从获得一个新的原型实例: 但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean: 如何直接使用@autowired注入来实现?

  • 我有两节课 还有一个雇员类 在我的控制器中,我从服务层检索数据,并尝试填充部门。这就是我的控制器的样子。 过去,如果我使用new关键字为CDI管理的bean构造实例,我会遇到麻烦。我可以使用new创建一个ArrayList,使用new构造Employee实例,将它们添加到列表中,然后在departmentbean中设置列表。有人能告诉我在ManagedBean部门填充员工(ManagedBean)

  • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!