DI的底层原理可以分为两个主要步骤:依赖对象的创建和依赖对象的注入。
- 依赖对象的创建:
在DI中,对象的创建通常由容器来负责。容器会维护一个对象的注册表,记录需要创建的对象及其对应的依赖关系。当需要创建一个对象时,容器会根据对象的定义和依赖关系,递归地创建依赖对象,并将它们注入到目标对象中。 - 依赖对象的注入:
在对象创建完成后,容器会将依赖对象注入到目标对象中。注入的方式可以通过构造函数注入、setter方法注入或字段注入等。容器会通过反射机制调用目标对象的构造函数或setter方法,将依赖对象作为参数传入,从而完成依赖注入。
下面是一个简单的示例代码,演示了DI的基本原理:
// 定义依赖对象 public class Dependency { public void doSomething() { System.out.println("Dependency: doSomething()"); } } // 定义目标对象 public class Target { private Dependency dependency; public Target(Dependency dependency) { this.dependency = dependency; } public void doSomething() { System.out.println("Target: doSomething()"); dependency.doSomething(); } } // 定义容器 public class Container { public static void main(String[] args) { // 创建依赖对象 Dependency dependency = new Dependency(); // 创建目标对象,并注入依赖对象 Target target = new Target(dependency); // 调用目标对象的方法 target.doSomething(); } }
在上面的示例中,容器负责创建依赖对象Dependency,并将其注入到目标对象Target中。最后,调用目标对象的方法,依赖对象的方法也会被调用。
需要注意的是,上述示例只是一个简单的演示,实际的DI框架通常会提供更丰富的功能和配置方式,例如通过注解配置依赖关系、支持循环依赖的解决方案等。
DI框架的源码实现相对复杂,涉及到反射、配置解析、对象生命周期管理等多个方面。常见的DI框架有Spring Framework、Google Guice等,你可以通过查阅它们的源码了解更多底层实现细节。