当前位置: 首页 > ops >正文

初识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 接口的对象,它是整个依赖注入流程的起点。

http://www.xdnf.cn/news/15312.html

相关文章:

  • 常用的docker命令备份
  • k8s:0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims.
  • 论文Review 3DGSSLAM GauS-SLAM: Dense RGB-D SLAM with Gaussian Surfels
  • 使用python操作文件夹
  • Hashtable 与 HashMap 的区别笔记
  • [GWCTF 2019]我有一个数据库
  • 05.判断日期是工作日还是周末
  • 改进广告投入与销售额预测分析
  • JavaSE-多态
  • 从架构到代码:飞算JavaAI电商订单管理系统技术解构
  • [CH582M入门第六步]软件IIC驱动AHT10
  • 算法题(174):全排列问题
  • 归并排序递归法和非递归法的简单简单介绍
  • 运放压摆率?正弦波怎么输出了三角波?
  • 数据结构 单链表(2)--单链表的实现
  • 打破并发瓶颈:虚拟线程实现详解与传统线程模型的性能对比
  • 二叉树算法详解和C++代码示例
  • C++封装、多态、继承
  • RFCOMM协议详解:串口仿真与TCP/IP协议栈移植技术——面试高频考点与真题解析
  • 在Intel Mac的PyCharm中设置‘add bin folder to the path‘的解决方案
  • 【Scratch】从入门到放弃(六):指令大全-扩展类
  • iOS高级开发工程师面试——关于优化
  • 在AI应用中Prompt撰写重要却难掌握,‘理解模型与行业知识是关键’:提升迫在眉睫
  • 关于数据库的慢查询
  • C/C++数据结构之多维数组
  • MyBatis04-MyBatis小技巧
  • QT 多线程 管理串口
  • Node.js特训专栏-实战进阶:16. RBAC权限模型设计
  • 沃尔玛 卡号查询 滑块 分析
  • 深度学习图像分类数据集—角膜溃疡识别分类