前言
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(); }
最后在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