一个接口多个实现类,如何指定特定实现类进行调用

示例

解决方法


在写程序的时候经常会遇到 写一个接口有多个实现类,那么在调用的时候是如何去确定调用的是哪个实现类呢?接下来将为你介绍几种方式:

示例

总接口

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