欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

小记:dagger

程序员文章站 2022-03-11 22:33:30
...

dagger

就是一个依赖注入,有时候我们不希望出现这样的情况 a类依赖于B类 一般都是在A类中去new B
类 但是这样有问题,玩意B类的构造函数改了,那么就要去改A类中的代码 是不符合标准的

创建一个A类

import javax.inject.Inject;

public class A {
    @Inject
    B b;
    @Inject
    C c;
    @Inject
    public A (){}
    //此处应该将结果回调,为了简单不写了
    public void xxoo(){
        System.out.println("翠花,关灯。。。");
        b.birthSon();
    }
    public void appointment(){
        System.out.println("上官无雪,晚上一起去看看月亮聊聊理想啊?");
        c.turnDown();
    }
}

inject就是注入的意思 A类依赖于B和C类,所以需要注入他们,但是想注入的话B类中就必须把构造函数也加这个注释

public class B {
    @Inject
    public B(){}

    public void birthSon(){
        System.out.println("我王二狗的儿子王不二降临人世了!");
    }
}

但是C类我们不去用一般注入方法,
用model注入法

C类是一个没有使用@Inject注解其构造函数的类,而且我们也无法加上,可能由于它是一个第三方类,或者其他原因。那我们想要使用dagger2将其注入到A类中就需要使用到Module。Module负责提供C类的实例对象,当Component发现了使用 @Inject注解的C类属性时,先去Module中查找,没有的话再去看其构造函数是不是使用@Inject标记了,如果都没有,注入失败。

public class C {
    public void turnDown(){
        System.out.println("癞蛤蟆想吃天鹅肉,滚!");
    }
}

写了一个module类 标记了@module的注解 其实就是去这个里面找他所想要依赖的类 给他返回就行了

@Module
public class DaggerModule {
    //此处为了尽量简单,其实这边可以有很多种写法
    @Provides
    public C providerC(){
        return new C();
    }


}
@Component(modules = {DaggerModule.class})
public interface MatchComponent {
    //添加被注入的东西,他会生成方法去注入你要发东西
    void mainActivityInject(MainActivity activity);

}

这给就是一个绑定类
放入mainactivity因为我们最后需要去里面去调用A类的方法,就是绑定他们在mainactivity里添加A类的依赖
当调用了 component.mainActivityInject(this);后就把mainactivity和A类绑定了也算一种依赖把

public class MainActivity extends AppCompatActivity {
    @Inject
    A a;
    @Inject
    B b;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MatchComponent component= DaggerMatchComponent.builder().build();
        component.mainActivityInject(this);
        findViewById(R.id.button1).setOnClickListener(v->{a.xxoo();});
        findViewById(R.id.button2).setOnClickListener(v->{a.appointment();});
    }
}
相关标签: 小记