【问题标题】:Does Spring DI have a fall back mechanism?Spring DI 有回退机制吗?
【发布时间】:2020-08-31 10:50:26
【问题描述】:
Spring DI 有回退机制吗?
我上面的意思是,如果由于某种原因无法实例化 bean A,那么可以实例化 bean B 并自动自动连接。
用例是 - 在测试中,如果由于网络连接而无法实例化 db bean。我想注入一个模拟 bean。
【问题讨论】:
标签:
spring
spring-boot
dependency-injection
autowired
spring-ioc
【解决方案1】:
您可以对 A 和 B 类使用 @Autowired(required = false) 并检查 @PostConstruct 方法是否已初始化 A 或 B。但我不知道任何机制仅在另一个 @Autowired 失败时才使用 @Autowired。
【解决方案2】:
您应该将 bean 实例化和自动装配的概念分开。
如果定义为 bean 的类 A(例如通过在其上放置 @Component)由于某种原因无法实例化,则应用程序上下文将无法启动,句号。
这与 bean 本身的依赖关系无关。
现在,如果你有 bean A 和 beans 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 类不会被实例化,整个应用程序上下文将失败,因为 spring 不知道您必须在 C 类中使用哪个实现(自动装配的两个候选对象)。
在这种情况下你需要给 Spring 提示:
- 使用
@Primary注解
- 使用
@Qualifier注解
因此,为了总结应用程序上下文的初始化过程,必须是确定性和明确定义的。