Dagger2进阶-简说SubComponent和Qualifier

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010782846/article/details/79840427

前言

    

        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();
}

最后在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());
    }
}
打印显示出,可以得到对象。

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
展开阅读全文

没有更多推荐了,返回首页