初识drag2框架,drag2注入的基本原理
🧱 1. 举个简单例子
我们从一个简单的例子开始,假设你有如下类:
@Component
public interface CarComponent {void inject(Car car);
}
class Engine {public void start() {System.out.println("Engine started");}
}class Car {@Inject Engine engine;@Injectpublic Car() {}
}
你没有手动 new Engine()
,但你希望 Dagger 自动注入这个依赖。
🛠️ 2. 编译期生成代码
当你使用 Dagger 并编译项目时,Dagger 会在编译阶段
生成以下代码(伪代码):
✅ 生成 Component 接口的实现类
public final class DaggerCarComponent implements CarComponent {private Engine provideEngine() {return new Engine(); // 这里是 Dagger 自动生成的 new Engine()}@Overridepublic void inject(Car car) {car.engine = provideEngine(); // 注入依赖}
}
✅ 如何启动注入依赖?在你实际代码中以下这样写就自动为car类注入好对应的属性对象依赖了
Car car = new Car();
DaggerCarComponent.create().inject(car);//这里自动注入了car 类中的属性对象engine
car.engine.start(); // 就正常调用了
🧱 1. 前置知识:什么是 Component?
在 Dagger 中,@Component
是一个接口,表示依赖注入的入口点。你可以把它理解为“装配工厂”。
比如:
@Component
public interface CarComponent {void inject(Car car);
}
这个接口告诉 Dagger:
inject(Car car)
,标识Car
这个类需要注入依赖!!!!!!
🔨 2. DaggerCarComponent.create()
是哪来的?
当你编译项目时,Dagger 会根据你的 @Component
接口生成一个实现类,名字就是:
DaggerCarComponent
这是 Dagger 的命名规则!!!!!!
Dagger + 接口名
所以:
DaggerCarComponent.create();
这行代码的作用是:
- 调用 Dagger 自动生成的
create()
方法 - 创建一个实现了你定义的
CarComponent
接口的实例
📦 3. create()
方法内部长什么样?
Dagger 会自动生成类似下面的代码(伪代码):
public final class DaggerCarComponent implements CarComponent {public static CarComponent create() {return new DaggerCarComponent();}private DaggerCarComponent() {// 构造函数,可能还会初始化 Module 或其他依赖}@Overridepublic void inject(Car car) {car.engine = new Engine(); // 注入依赖}
}
所以调用 DaggerCarComponent.create()
实际上返回的是一个:
new DaggerCarComponent()
🚗 4. 使用示例回顾
Car car = new Car();
DaggerCarComponent.create().inject(car); // 注入依赖
car.engine.start(); // 正常调用
等价于:
Car car = new Car();
CarComponent component = new DaggerCarComponent(); // Dagger 生成的
component.inject(car);
📚 补充知识(进阶)
✅ 除了字段注入,还可以构造函数注入
class Car {private final Engine engine;@Injectpublic Car(Engine engine) {this.engine = engine;}
}
这时候你依然只需要:
@Component
interface CarComponent {void inject(Car car);
}
Dagger 会自动调用带 @Inject
的构造函数来创建对象。
✅ 如果你忘记加 inject 方法会怎样?
如果你写了:
@Component
interface CarComponent {}
那 Dagger 就不会生成注入 Car
的逻辑,你调用 inject(Car)
会报错或无效果。
🧠 总结一句话:
DaggerCarComponent.create()
是 Dagger 框架在编译期自动生成的方法,用于创建一个实现了你定义的@Component
接口的对象,它是整个依赖注入流程的起点。