一个接口多个实现类,如何指定特定实现类进行调用
示例
解决方法

在写程序的时候经常会遇到 写一个接口有多个实现类,那么在调用的时候是如何去确定调用的是哪个实现类呢?接下来将为你介绍几种方式:
示例
总接口
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();     //正常启动
 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐