1

我是 Spring 和 Dependancy Injection 的新手,所以我会尽力而为,但这个问题可能并不完美。

简而言之,想象一个包含“奶酪”组件的“三明治”程序。瑞士奶酪和普罗瓦龙奶酪都适合接口,因此它们都可以用于我们的三明治。我们的代码可能看起来像这样。

class Sandwich{
   @Autowired
   Meat m;
   @Autowired
   Cheese c;
}

@Component
class Ham implements Meat{
}

@Component
class Swiss implements Cheese{
}

@Component
class Provolone implements Cheese{
}

很明显spring框架会用火腿做肉;它是唯一的肉类成分。但是spring框架在瑞士和provolone之间是如何选择的呢?程序员是否需要进一步设置?如果是这样,这怎么不是紧耦合?

谢谢(你的)信息!这种企业级编码对我来说是新的(而且有点吓人),所以任何输入都会受到赞赏。

4

2 回答 2

1

这篇文章很好地涵盖了它https://www.baeldung.com/spring-autowire#disambiguation

但简而言之,Spring 遵循以下步骤:

  1. 它将检查字段的类型,然后在ApplicationContext. 如果只有一个合格的 bean,它将注入该 bean
  2. 否则,它将尝试通过查看变量名称来消除歧义,如果存在具有相同名称和类型的合格 bean,它将注入该 bean
  3. 否则,它将@Qualifier在该字段上查找注释。如果有注解,它会使用里面的逻辑来决定注入哪个bean
  4. 如果还是无法解析,Spring会抛出异常

我建议在您的示例中仅实例化一种类型的奶酪豆。您可以通过使用注释对类进行@Profile注释并使用运行时配置文件值来选择要实例化的类来做到这一点。

或者,您可以声明List<Cheese> c,Spring 会将两个奶酪作为List. List然后您可以根据您的业务逻辑选择在运行时调用哪个奶酪。

于 2022-01-27T23:18:07.767 回答
0
 In this case spring will give you the error as spring container have
 two object of type cheese that are Swiss and Provolone.
    
    class Sandwich{
       @autowired
       meat m;
       cheese c;
    }
    
    @component
    class Ham implements meat{
    }
    
    @component
    class Swiss implements cheese{
    }
    
    @component
    class Provolone implements cheese{
    }
    
    Now if you want to provide a particular cheese object to sandwich you can 
  add @Qualifier("swiss) or @Qualifier("provolone") onto the cheese object 
   (like to provide spring which object you have to refer).

  //Now asking springboot to refer swiss cheese in sandwich will be as follows.
    
    class Sandwich{
       @autowired
       meat m;
       @Qualifier("swiss")
       cheese c;
    }
    
    @component
    class Ham implements meat{
    }
    
    @component
    class Swiss implements cheese{
    }
    
    @component
    class Provolone implements cheese{
    }
于 2022-01-31T18:06:26.387 回答