美文网首页
SpringBoot(19) — 为@Autowired消除歧义

SpringBoot(19) — 为@Autowired消除歧义

作者: 奔跑的佩恩 | 来源:发表于2021-08-07 12:31 被阅读0次

前言

在上一节中,我们讲到了依赖注入的注解@Autowired的使用,大家感兴趣的话,可参考
SpringBoot(18) — 依赖注入@Autowired
在那片文章中,我们知道,当我们在一个类中,引用一个接口类对象的时候,该接口对象会自动往下兼容,从而找到它的实现类来代替它实现业务逻辑,这只仅限于当该接口只有一个实现类的情况。那么当被引用的接口对象有多个实现类的时候,该怎么办呢?今天就来讲讲相关处理办法。

今天涉及知识有:

  1. 消除歧义用到的注解
  2. @Primary的使用
  3. @Qualifier的使用
  4. 需要注意的问题

先来波测试结果:

======我是测试啊=====
=====吃饭啊=====

一. 消除歧义用到的注解

先给出一个项目结构图

image.png
现在我有一个场景:HelloController类要调用EatFood接口,而EatFood接口有两个实现类:EatRiceEatMeat。这样,当我们在HelloController类中利用注解@Autowired引用EatFood时,势必会让EatFood感到困惑,到底是调用EatRice,还是调用EatMeat呢?
这时候,我们则需要利用两个新注解来协助解决歧义:
  • @Primary
  • @Qualifier

接下来让我们分辨来讲讲他们是怎么使用的吧。

二. @Primary 的使用

首先我们先将EatRiceEatMeat注入到IoC容器中。
下面给出EatRice代码:

@Component("EatRice")
public class EatRice implements EatFood{

    @Override
    public void eat() {
        LogUtil.println("=====吃饭啊=====");
    }
}

这里需要注意的是@Component("EatRice")中的"EatRice"一定要写,注为容器内的唯一标注,我们后面会用到的。
接下来是EatMeat代码:

@Component("EatMeat")
public class EatMeat implements EatFood{

    @Override
    public void eat() {
        LogUtil.println("=====吃肉啊=====");
    }

}

同理,为了代码规范性及使用方便,我们的@Component("EatMeat")"EatMeat"最好写上。
EatFood作为一个接口类,代码很简单,如下:

public interface EatFood {

    void eat();
}

最后一步是配置类AppConfig,只有配置了它,才能将EatRiceEatMeat装配到IoC容器中。我们设置装配扫描范围为com.firstpro.test/即可。AppConfig代码如下:

相关文章

网友评论

      本文标题:SpringBoot(19) — 为@Autowired消除歧义

      本文链接:https://www.haomeiwen.com/subject/bliwvltx.html