Java 在春季将原型列表注入单例bean
春天这里需要一些帮助。 在我们的项目中,我们使用XML和注释配置(Spring4.1) 最近我面临着以下任务: 我有一个范围原型的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实现
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;
}
}