【问题标题】: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注解

    因此,为了总结应用程序上下文的初始化过程,必须是确定性和明确定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 2012-02-21
      • 2014-11-16
      • 2014-12-04
      • 1970-01-01
      • 2014-02-02
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多