在 Java 中,当一个接口被自动装配(或依赖注入)时,通常是通过 Spring Framework 进行的。Spring 的自动装配功能是通过反射和代理实现的。让我们来看一下为什么接口被自动装配后可以调用其实现类的方法:
接口定义:首先,你有一个接口,它定义了一组抽象方法。例如:
public interface MyService {
void doSomething();
}
接口的实现类:然后,你有一个类实现了这个接口:
public class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
Spring 自动装配:在 Spring 中,你可能会将接口 MyService
注入到其他类中。例如:
@Service
public class MyController {
private final MyService myService;
public MyController(MyService myService) {
this.myService = myService;
}
public void invokeServiceMethod() {
myService.doSomething(); // 这里调用了接口方法
}
}
在这个例子中,MyController
类中的 MyService
对象被自动装配(通过构造函数注入)。但是,MyService
是一个接口,它并没有具体的实现。Spring 在运行时会选择一个实现类来实例化这个接口。默认情况下,如果只有一个实现类,Spring 就会选择它。然后,当你调用 myService.doSomething()
时,实际上是调用了实现类 MyServiceImpl
中的方法。
这是因为 Spring 在运行时会创建一个代理对象,这个代理对象实现了你的接口,并且在调用接口方法时会委托给实际的实现类。这种代理方式使得在代码中使用接口更加灵活,并且可以方便地替换实现类而不需要修改调用方的代码。