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

初识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.dtcms.com/a/278226.html

相关文章:

  • [Python 基础课程]元组
  • HashMap 和 ConcurrentHashMap 的区别
  • JAVA学习笔记 JAVA开发环境部署-001
  • 【Datawhale夏令营】用AI做带货视频评论分析
  • Origin自带的悬浮尺子,Screen Ruler的最佳平替
  • C# 接口(接口可以继承接口)
  • 终极剖析HashMap:数据结构、哈希冲突与解决方案全解
  • 【面板数据】上市公司诉讼风险、诉讼次数等数据集(2007-2023年)
  • 【LeetCode100】--- 4.移动零【复习回顾】
  • 剑指offer58_和为S的连续正数序列
  • 深入理解 LangChain:AI 应用开发的全新范式
  • 人工智能到底是什么?揭开 AI 的神秘面纱
  • Spring @Autowired:依赖注入的核心奥秘
  • markdown-it-mathjax3-pro —— 新一代 Markdown 数学公式渲染插件
  • 代码精进之路
  • NumPy 中 np.c_ 的用法解析
  • Prometheus 第一篇:快速上手
  • 哪些行业的“反内卷”前景更好?
  • DL00454-深度学习牲畜资产管理圈养生猪行为识别含数据集
  • Docker搭建Redis哨兵集群
  • 代码部落 20250713 CSP-S复赛 模拟赛
  • Windows上使用配置Claude Code教程
  • 软件文档体系深度解析:工程视角下的文档架构与治理
  • 知识图谱构建简单分享
  • Task-driven Image Fusion with Learnable Fusion Loss
  • 嵌入式固件 .pkg 打包流程
  • DNS解析过程和nmap端口扫描
  • 大模型之Langchain篇(二)——RAG
  • C语言:流程控制
  • 前四天综合总结