Component的组织关系与SubComponent 多个Component之间有相同的依赖,那么该如何处理它们之间的关系? 前言 先看下面一个场景 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Man { @Inject Car car; public void goWork() { ... car.go(); ... } } public class Friend { @Inject Car car; // 车是向 Man 借的 public void goSightseeing() { ... car.go(); ... } } Man 有一辆车,Friend 没有车,但是他可以借 Man 的车出去游玩下,提供 Car 实例的CarModule不变,那么我们应该怎么设计 Component 呢?

入门 要实现依赖注入,首先要声明一个依赖对象的需求,这个声明是通过@Inject注解来实现的,所以Car类的实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class Car { String mName; @Inject Engine mEngine; public Car(Engine engine){ mEngine = engine; } public String getName(){ return mName; } Engine getEngine(){ return mEngine; } } 声明了需求之后,需要声明提供方。提供方声明有两种方式: 使用@Inject注解被依赖对象的构造方法; 使用@Provide注解Module类的普通方法。 先用第一种来实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Engine { public final int CYLINDER_FUEL_COST = 10; int mCylinderNumbers; @Inject public Engine(){ mCylinderNumbers = 1; } public Engine(int cylinderNumbers){ this.

Scope(作用域) Scope是用来确定注入的实例的生命周期的,如果没有使用Scope注解,Component每次调用Module中的provide方法或者Inject构造函数生成的工厂时都会创建一个新的实例,而使用Scope后可以复用之前的依赖实例。下面先介绍Scope的基本概念与原理,再分析Singleton、Reusable等作用域。 Scope基本概念 先介绍Scope的用法,@Scope是元注解,是用来标记自定义注解的,如下: 1 2 3 4 @Documented @Retention(RUNTIME) @Scope public @interface MyScope {} MyScope就是一个Scope注解,Scope注解只能标注目标类、@provide方法和component。Scope注解要生效的话,需要同时标注在Component和提供依赖的示例的Module或者目标类上。Module中provide方法中的Scope注解必须和与之绑定的Component的Scope注解一样,否者作用域不同会导致编译时报错。例如,CarModule中的provide方法的Scope是MyScope的话,ManComponent的Scope必须是MyScope这样的作用域才会生效,而且不能是@Singleton或者其它Scope注解,不然编译时Dagger2会报错。 那么 Scope 注解又是如何产生作用的呢,怎么保证生成的依赖实例的生命周期呢? 在 Dagger 2 官方文档中我找到一句话,非常清楚地描述了@Scope的原理: When a binding uses a scope annotation, that means that the component object holds a reference to the bound object until the component object itself is garbage-collected. 当 Component 与 Module、目标类(需要被注入依赖)使用 Scope 注解绑定时,意味着 Component 对象持有绑定的依赖实例的一个引用直到 Component 对象本身被回收。也就是作用域的原理,其实是让生成的依赖实例的生命周期与 Component 绑定,Scope 注解并不能保证生命周期,要想保证赖实例的生命周期,需要确保 Component 的生命周期。

https://blog.csdn.net/poorkick/article/details/80458707