前言
在上一节中,我们讲到了依赖注入
的注解@Autowired
的使用,大家感兴趣的话,可参考
SpringBoot(18) — 依赖注入@Autowired
在那片文章中,我们知道,当我们在一个类中,引用一个接口类对象的时候,该接口对象会自动往下兼容,从而找到它的实现类来代替它实现业务逻辑,这只仅限于当该接口只有一个实现类的情况。那么当被引用的接口对象有多个实现类的时候,该怎么办呢?今天就来讲讲相关处理办法。
今天涉及知识有:
- 消除歧义用到的注解
-
@Primary
的使用 -
@Qualifier
的使用 - 需要注意的问题
先来波测试结果:
======我是测试啊=====
=====吃饭啊=====
一. 消除歧义用到的注解
先给出一个项目结构图
现在我有一个场景:
HelloController
类要调用EatFood
接口,而EatFood
接口有两个实现类:EatRice
和EatMeat
。这样,当我们在HelloController
类中利用注解@Autowired
引用EatFood
时,势必会让EatFood
感到困惑,到底是调用EatRice
,还是调用EatMeat
呢?这时候,我们则需要利用两个新注解来协助解决歧义:
@Primary
@Qualifier
接下来让我们分辨来讲讲他们是怎么使用的吧。
二. @Primary 的使用
首先我们先将EatRice
和EatMeat
注入到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
,只有配置了它,才能将EatRice
和EatMeat
装配到IoC
容器中。我们设置装配扫描范围为com.firstpro.test/
即可。AppConfig
代码如下:
网友评论