假设我们有一个接口“.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,我们就不会为接口创建对象。为什么?这里发生了什么?
1条答案
按热度按时间vmjh9lq91#
我们不能在java中创建接口的对象。
java中的接口可以定义为一个完整的抽象类,包含字段(public、static和final)和空方法(public和abstract)。尽管在Java8中我们可以定义默认方法,这些方法可以有它们的主体,而在Java9中我们甚至可以有私有方法。
但关键是,在接口中,我们在对象级别没有字段,因为默认情况下所有字段都是静态的。因此,有一个构造函数是不符合逻辑的,也没有意义的
这意味着-->没有对象创建。
当我们使用spring@autowired初始化接口时,spring实际上并没有创建该接口的对象,而是创建了其子类的对象。
在这种情况下,因为接口只存在一个子类,即类impl。
当我们使用@autowired时,spring会这样做:
只是一个存储子类对象的引用变量(接口实现之一)。如果我们有多个子类并且使用@autowired,事情就会变得有趣。然后spring通过首先检查类型然后检查名称来解决这种歧义。如果两者都相同,那么我们可以使用@qualifier之类的方法添加一些额外的标记来区分它。