一个接口多个实现类,如何指定特定实现类进行调用
示例
解决方法
在写程序的时候经常会遇到 写一个接口有多个实现类,那么在调用的时候是如何去确定调用的是哪个实现类呢?接下来将为你介绍几种方式:
示例
总接口
public interface Animal {
//动物的叫声
public void call();
//动物吃的东西
public void eat();
}
实现类1
@Service("dogImpl")
public class Dog implements Animal {
@Override
public void call() {
System.out.println("汪汪汪……");
}
@Override
public void eat() {
System.out.println("骨头");
}
}
实现类2
@Service("catImpl")
public class Cat implements Animal {
@Override
public void call() {
System.out.println("喵喵喵……");
}
@Override
public void eat() {
System.out.println("鱼");
}
}
解决方法
方法1 指明实现类的优先级
在写实现类的时候事先指明实现类的优先级,注入的时候就会使用优先级高的实现类。在调用的类中注入接口,默认使用的是Primary 标注的实现类的方法
如:
@Service("dog")
@Primary
public class Dog implements Animal {
…….
}
注:同一个接口的多个实现类,最多只能有一个添加该注解
此方法 ,我用的不多
方法2 通过@Autowride和@Qualifier两个注解配合使用
如:
在调用处使用这两个注解
@Autowired
@Qualifier("dog")
private Animal animal; //正常启动
注:注解@Qualifier内的值是实现类的默认名
方法3 使用@Resource注解,默认类名区分
如:
在调用处使用此注解
@Resource(name = "dog")
private Animal animal; //正常启动
注:注解@Qualifier内的值是实现类的默认名
方法4 使用@Resource注解,根据@Service区分
如:
在调用处使用此注解
@Resource(name = "dogImpl")
private Animal animal; //正常启动
注:注解@Qualifier内的值是实现类中@Service指定的名字
方法5 直接new 一个实例
如:
在调用处使用
private Animal animal = new Dog(); //正常启动
————————————————
版权声明:本文为CSDN博主「JSUITDLWXL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JSUITDLWXL/article/details/122700534