前言
Dagger2进阶-范围的控制(Scope和Singleton)
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