Dagger2进阶-简说SubComponent和Qualifier

前言

    

        Dagger2的介绍和配置

        Dagger2基础的使用

        Dagger2进阶-编译生成源码解读

        Dagger2进阶-范围的控制(Scope和Singleton)

        Dagger2进阶-Scope的源码探究

         Dagger2进阶-简说SubComponent和Qualifier

        项目源码传送门

 

 

    因为SubComponent和Qualifier比较简单,所以归为一章来说。

SubComponent怎么用

    我们建立一个新的界面ThirdActivity和ThirdModule、ThirdCompnent:

    

@Module
public interface ThirdModule {

}
@Subcomponent(modules = ThirdModule.class)
public interface ThirdCompnent {
    void inject(ThirdActivity thirdActivity);
}

然后在AppComponent中扩展添加子组件:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(MyApplication myApplication);

    ThirdCompnent addSub(ThirdModule thirdModule);

    //告诉依赖的Component,我给你提供了这个类。比不可少。
    Goods getGoods();
}ThirdCompnent addSub(ThirdModule thirdModule);

    //告诉依赖的Component,我给你提供了这个类。比不可少。
    Goods getGoods();
}

最后在ThirdActivity请求创建对象:

public class ThirdActivity extends AppCompatActivity {

    @Inject
    Person mPerson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        ThirdCompnent thirdCompnent=MyApplication.newInsatnce().getAppComponent().addSub(new ThirdModule());
        thirdCompnent.inject(this);

        Log.d("ThirdActivity",mPerson.toString());
    }
}  @Inject
    Person mPerson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        ThirdCompnent thirdCompnent=MyApplication.newInsatnce().getAppComponent().addSub(new ThirdModule());
        thirdCompnent.inject(this);

        Log.d("ThirdActivity",mPerson.toString());
    }
}

打印显示出,可以得到对象。

SubComponnent源码解读

通过编译,我们查看到    ThirdCompnent addSub(ThirdModule thirdModule);这句话在DaggerAppComponent中生成了

从上面源码看到,模板代码为什么的子组件生成了一个实现类,通过实现类的inject方法层层调用为Activity赋值,其实原理都一样。

SubComponent和Component的区别

1.Component需要告诉依赖的模块需要开放权限的类,也就是显示提供依赖,比如Goods

    SubComponent用法需要添加SubComponent修饰的组件到Component中。

2.SubComponent减少了很多Dagger_XX类,但是父Component却需要持有SubComponent的依赖,这在多组件的应用中无法得到。

Component用法如图:

Subomponent如图:

Qualifier的使用

 

@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Name {
    String value()  default "";
}

 

 @Name("value")
    @Provides
    Order provideOrder2(Goods goods){
        Order order=new Order(goods);
        order.setName("我的另外的Order");
        return order;
    }

 

@Name("value")
@Inject
Order mOrder2;

@Qualifier不可以直接用,需要另外重定义。

@Qualifier

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值