gpt4 book ai didi

java - 在 Spring 中将原型(prototype)列表注入(inject) Singleton bean

转载 作者:行者123 更新时间:2023-11-30 07:07:44 24 4
gpt4 key购买 nike

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

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

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

每次执行“execute”方法时,我都希望能够访问这些原型(prototype) bean 的不同实例。在单例中,我没有预先知道的完整 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 接口(interface)完全解耦的解决方案(例如注入(inject) ApplicationContext/BeanFactory 的东西)我不介意在这里使用 Aop(性能并不那么重要),但我无法真正理解干净的 Spring 解决方案。因此,任何帮助将不胜感激。

提前致谢

最佳答案

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

No qualifying bean of type 'java.util.List' available

显然 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;
}
}

然后为List对象创建一个Factory类:

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

}

最后实现接口(interface)并确保用 @Scope("prototype") 标记它们

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

如果您愿意,它与使用方法注入(inject)类似。

关于java - 在 Spring 中将原型(prototype)列表注入(inject) Singleton bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com