简单介绍
定义什么的就不解释了,主要就两个字:解耦
image.png
注解
@Inject
通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样Dagger就会构造一个这样的类的实例并满足他们的依赖
@Module
moudles类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例时候,就知道从哪里去找到需要的依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,我们的app中可以有多个组成在一起的modules中)
@Provide
在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖
Component
Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是 连接着两个部分。Components可以提供所有定义了的类型的实例,比如,我们用@Component注解一个接口然后列出所有的
用法
这里可能很多人想说,定义谁不知道,上网搜一大堆,ok,别急。我们举例MVP中我们在view层会实现自己定义的view接口层和会拥有一个P层,一般我们都会这么实例
RecommendContract.Presenter mPresenter;
mPresenter = new RecommendPresenter(this);
RecommendPresenter在构造方法的时候需要对module进行初始化
public RecommendPresenter(RecommendContract.View view, RecommendModel model) {
this.mView = view;
mModel = new RecommendModel();
}
还有,我们访问网络的时候,我们会定义一个dialog,我们会这样去实例化
ProgressDialog mProgressDialog;
mProgressDialog = new ProgressDialog(getActivity());
我们这时候用Dagger进行隔离,不在进行这么多new的初始化操作,首先我们添加依赖,我的android版本是3.0,不需要添加classpath等
//dagger2
annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
implementation 'com.google.dagger:dagger:2.0.2' //dagger公用api
compileOnly 'org.glassfish:javax.annotation:10.0-b28' //添加android缺失的部分javax注解
首先我们对我们解耦的对象添加@Inject属性
@Inject
ProgressDialog mProgressDialog;
@Inject
RecommendContract.Presenter mPresenter;
然后根据注解添加一个Module类,并添加一个注解@Module,完整代码
@Module
public class RemmendModule {
private RecommendContract.View mView;
public RemmendModule(RecommendContract.View view) {
this.mView = view;
}
//参数RecommendContract.View Dagger会从其中拿相应类型RecommendContract.View的view并且添加注解的Provides,如果没有则报错
@Provides
public RecommendContract.Presenter providePeresenter(RecommendContract.View view,RecommendModel model) {
return new RecommendPresenter(view,model);
}
@Provides
public RecommendModel provideModel() {
return new RecommendModel();
}
@Provides
public RecommendContract.View provideView() {
return mView;
}
@Provides
public ProgressDialog provideProgressDialog(RecommendContract.View view) {
return new ProgressDialog(((RecommendFragment) view).getActivity());
}
@Provides
public RecomendAppAdatper provideAdapter() {
return null;
}
}
这里有人看不懂 public RecommendContract.Presenter providePeresenter(RecommendContract.View view,RecommendModel model) ;这里的构造函数并没有去new 和传过来,这样写会不会报错。这里,其实并不会,Dagger会去找构造函数中的参数RecommendContract.View返回类型一样的方法,并判断是否添加了@Provides注解。如果没有则报错,如果有会将值带过去。
module和inject都有了,这时候我们就需要用Component类对这两者进行组合
@Component(modules = RemmendModule.class)
public interface RecommendComponent {
void inject(RecommendFragment fragment);
}
原本presenter中module是new出来的,现在通过构造函数传过来
public RecommendPresenter(RecommendContract.View view, RecommendModel model) {
this.mView = view;
mModel = model;
}
重新build一下以后,在Fragment或Activity中使用
DaggerRecommendComponent.builder().remmendModule(new RemmendModule(this)).build().inject(this);
网友评论