Dagger2(初步探索二)

针对上一篇文章,发现后面的自定义Qualifier的操作符用法还有更为优化的地方,现贴出优化后的代码。

一 自定义操作符

module

  /*****************************************************************************************************************************/
    /* * 拓展 * */
    /*参数必须得提供,否则生成不了dagger+component*/
  /* @Provides public AClass provideQualiAClass(@StringQuali("a") String name) { return new AClass(name); } //参数必须得提供,否则生成不了dagger+component @Provides public BClass provideQualiBClass(@StringQuali("b") String name) { return new BClass(name); } @Provides @StringQuali("a") public String provideAString() { return "小红A"; } //提供B类的字符串,在同一类中,provideBClass默认会自动寻找需要的返回类型,故不能重复 @Provides @StringQuali("b") public String provideBString() { return "小红B"; }*/

    /*****************************************************************************************************************************/
    /* * 优化以上代码 * */
    @Provides
    @StringQuali("小明A")
    public AClass provideQualiAClass() {
        return new AClass("小明A");
    }
    @Provides
    @StringQuali("小明B")
    public AClass provideQualiBClass() {
        return new AClass("小明B");
    }

Acitivity

  /* @Inject AClass aClass; @Inject BClass bClass;*/
    @Inject
    @StringQuali("小明A")
    AClass aClass;
    @Inject
    @StringQuali("小明B")
    AClass bClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*注入到activity中*/
        DaggerMyComponent.builder().model(new MyModule("A")).build().inject(this);
        Log.e("yan", aClass.getName()+","+bClass.getName());
    }

自定义操作符优化到此,现讲解下@Scope的简单用法

二 限定注解作用域

@Scope: Dagger 可以通过自定义注解限定注解作用域

  • 定义ActivityScope
/** * 自定义的范围注解,作用是允许对象被记录在正确的组件中,当然这些对象的生命周期应该遵循 Activity 的生命周期。 */

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
  • 在COmponent中使用
@ActivityScope
@Component(modules = MyModule.class)
public interface MyComponent {
    void inject(MainActivity activity);
}

三 单例模式注解

@Singleton:单例模式,依赖的对象只会被初始化一次

很简单

    @Provides
    @Singleton
    @StringQuali("小明B")
    public AClass provideQualiBClass() {
        return new AClass("小明B");
    }

你可能感兴趣的:(Dagger2(初步探索二))