繁体   English   中英

我们如何创建与 Spring 接口的 object 来自动连接它,但是在 Z93F7426F444B8C 中创建相同的 object 是错误的?

[英]How can we create an object of interface with Spring to autowire it but it's wrong to create the same object in java?

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

interface ABC {
    public void hello();
}

现在我们有一个 class 像“ABCimpl.java”

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

现在我们还有一个名为“DEFinpl.java”的 class

public class DEFimpl{
    @Autowired
    ABC abc;

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

但如果我们只是使用 java,我们不会为接口创建 object。 这是为什么? 这里发生了什么?

我们无法在 Java 中创建接口的 object。

java 中的接口可以定义为具有字段public、static 和 final )和空方法( public 和 abstract )的完整抽象 class。 尽管从 Java 8 我们可以定义可以拥有它们的主体的默认方法,并且在 Java 9 我们甚至可以拥有私有方法。

但关键是,在一个界面中,我们没有 object 级别的字段,因为默认情况下它们都是 static。 因此,拥有一个构造函数是不合逻辑或没有意义的

这意味着 --> 没有 object 创建。

When we use spring @Autowired for initializing an interface, spring does not actually create an object of that interface rather an object of its child class is created.

在这种情况下,由于接口 ABC 仅存在一个子 class,即 class ABCImpl。

所以 Spring 在我们使用@Autowired时会做这样的事情:

ABC abc = new AbcImpl(); 

abc 只是一个参考变量,存储子 class 的 object(接口 ABC 实现之一)。 如果我们有多个子类并且我们使用@Autowired,事情就会变得有趣。 然后 spring 通过首先检查类型然后检查名称来解决这种歧义。 如果两者都相同,那么我们可以 go 使用 @Qualifier 之类的东西添加一些额外的标签来区分它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM