Spring DI有回退机制吗?

问题描述

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批注

因此,要总结应用程序上下文的初始化过程,必须确定性和良好的定义。