我建议
FactoryBean为此编写一个实现。您
FactoryBean将扫描bean工厂以查找实现的bean,
MyService如果找到实现的bean,它将从中返回该bean
getObject。如果不是,则可以
MyDefaultService直接实例化并返回该实例。然后,您的工厂bean用添加了注释
@Primary。
像这样的片段(伪代码):
public class MyServiceFactory implements FactoryBean<MyService> { ListableBeanFactory beanFactory; public MyService getObject() { Map beans = beanFactory.getBeansOfType(MyService.class) if (beans.isEmpty()) return new MyDefaultService(); // plus args, obviously else return get_some_bean_from_the_map }}然后
@Primary@Beanpublic MyServiceFactory MyServiceFactory() { return new MyServiceFactory();}Spring将自动处理工厂bean(即,将
MyService对象像正常情况一样用作注入的bean)。
该解决方案不需要任何特殊的魔术,并且它的工作原理非常明显。您还可以处理错误的情况,例如
MyService声明了多个bean。



