我们如何用spring创建一个interface对象来自动连接它,但在java中创建同一个对象是错误的?

myss37ts  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(371)

假设我们有一个接口“.java”

interface ABC {
    public void hello();
}

现在我们有了一个类似“impl.java”的类

public class ABCimpl implements ABC{

    @Override
    public void hello(){
         System.out.println("Hello World!");
    }
}

现在我们又有了一个名为“definpl.java”的类

public class DEFimpl{
    @Autowired
    ABC abc;

    public void trial(){
        abc.hello();
    }
}

但是如果我们只是简单地使用java,我们就不会为接口创建对象。为什么?这里发生了什么?

vmjh9lq9

vmjh9lq91#

我们不能在java中创建接口的对象。
java中的接口可以定义为一个完整的抽象类,包含字段(public、static和final)和空方法(public和abstract)。尽管在Java8中我们可以定义默认方法,这些方法可以有它们的主体,而在Java9中我们甚至可以有私有方法。
但关键是,在接口中,我们在对象级别没有字段,因为默认情况下所有字段都是静态的。因此,有一个构造函数是不符合逻辑的,也没有意义的
这意味着-->没有对象创建。
当我们使用spring@autowired初始化接口时,spring实际上并没有创建该接口的对象,而是创建了其子类的对象。
在这种情况下,因为接口只存在一个子类,即类impl。
当我们使用@autowired时,spring会这样做:

ABC abc = new AbcImpl();

只是一个存储子类对象的引用变量(接口实现之一)。如果我们有多个子类并且使用@autowired,事情就会变得有趣。然后spring通过首先检查类型然后检查名称来解决这种歧义。如果两者都相同,那么我们可以使用@qualifier之类的方法添加一些额外的标记来区分它。

相关问题