问题描述
Spring DI有回退机制吗?
我上面的意思是,如果由于某种原因无法实例化bean A
,那么可以实例化bean B
并自动进行自动连线。
用例是-在测试中,是否由于网络连接而无法实例化db bean。我想要注入模拟豆。
解决方法
您可以对类A和B使用@Autowired(required = false),并在@PostConstruct方法中检查是否初始化了A或B。但是我不知道有什么机制只能在其他@Autowired失败时才使用@Autowired。
,您应该将bean实例化和自动装配的概念分开。
如果由于某种原因而无法实例化定义为Bean的类A
(例如,通过在其上放置@Component
),则应用程序上下文将不会启动。
这与bean本身的依赖性无关。
现在,如果您的bean A
和bean B
和bean C
具有两个自动布线的“候选”,则它看起来像这样:
public interface I {}
@Component
public class A implements I {}
@Component
public class B implements I {}
@Component
public class C {
@Autowired
private I i;
}
在这种情况下,将不会实例化C类,并且整个Application Context将失败,因为spring不会知道您必须在C类中使用哪种实现(两个自动装配的候选对象)。
在这种情况下,您需要给Spring提示:
- 使用
@Primary
批注 - 使用
@Qualifier
批注
因此,要总结应用程序上下文的初始化过程,必须确定性和良好的定义。