Dagger2中@dependencies和@Subcomponent以及懒加载的使用

来源:互联网 发布:js array map ie8 编辑:程序博客网 时间:2024/06/06 09:49

一、dependencies的使用

顾名思义,就是依赖,如果Acomponent想使用别的Bcomponent管理的实例,那么就可以直接让Acomponent去依赖Bcomponent,就能直接使用B所管理的实例了,例子如下:

1.1:建立实体类,并创建它的module和component

public class Food {    public void eatFood(){        Log.e("Food", "eatFood: ");    }}public class Cloth {}@Modulepublic class PacketModule {    @Singleton    @Provides    public Food getFood() {        return new Food();     }    @Singleton    @Provides    public Cloth getCloth() {        return new Cloth();     }    }    //这里注意要在它的component中返回所管理对象的实例    @Component(modules = PacketModule.class)    public interface PacketComponent {    Food getFood();}

1.2、使用@dependency进行依赖,并获取component实例

//进行依赖component@ApplicationScope@Component(modules = GsonModule.class, dependencies = PacketComponent.class)public interface MainActivityComponent {    void inject(MainActivity activity);    void inject(SecondActivity activity);}//在定义的Application中获取component的实例,这里与之前的获取方式不太一样 component = DaggerMainActivityComponent.builder().packetComponent(DaggerPacketComponent.create()).build();

1.3、进行注入,然后观察是否可以使用Food的对象

  @Inject  Food food;   MyApplication.get(this).getComponent().inject(this);    public void test(View view) {        food.eatFood();    }

现在我们观察log日志,看是否成功,打印结果如下
08-03 17:17:08.807 4340-4340/testdagger.com.xn.testdagger2 E/Food: eatFood:
可见我们已经得到了我们想要的对象,成功!

二:懒加载的使用

懒加载使用起来非常简单其实,懒加载的意思是不在注入的时候进行初始化而是在使用的时候进行初始化,更改上面代码:

 @InjectLazy<Food> lazyFood; MyApplication.get(this).getComponent().inject(this);  public void test(View view) {        Food food = lazyFood.get();        food.eatFood();    }

测试结果同样OK的.注意Module中标注创建实例的方法的Scope注解必须与管理该Module的component的Scope 注解一样,若是不一样,就会报错.

三、Subcomponent的使用

这里我们可能会有疑问使用@dependencies和@Subcomponent到底有什么区别,都属于component的组织方式,区别如下:

dependencies以下情况使用:
你想让两个 Component 都独立,没有任何关联. 你想很明确的告诉别人我这个 Component 所依赖的 Component.

Subcomponent 依赖以下情况使用:
你想让两个 Component 内聚. 你应该并不关心这个 Component 依赖哪个 Component。

而且使用@dependencies只能获取到所依赖的component直接返回的对象,而使用@Suncomponent则能获取父Component所管理的所有对象。

具体使用:待更新,出了点bug,一时没找到原因

原创粉丝点击