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