Dagger2的作用
依赖注入框架解开Activity和Presenter的耦合(因为MVP模式中
Activity持有Presenter的引用
,同时Presenter也持有View的引用
,这样Activity和presenter就耦合了)
使用方法(以LoginActivity为例)
- 在项目中添加依赖
dependencies {
...
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
compile 'com.google.dagger:dagger:2.11'
compile 'javax.annotation:javax.annotation-api:1.2'
}
- 新建ILoginActivityContract接口,使用更方便
public interface ILoginActivityContract {
interface IPresenter {
}
interface IModel {
}
interface IView {
}
}
- 新建LoginActivity
//实现ILoginActivityContract.IView接口
public class LoginActivity extends AppCompatActivity implements ILoginActivityContract.IView {
@Inject
ILoginActivityContract.IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
}
- 新建LoginActivityPresenter
//实现ILoginActivityContract.IPresenter接口
public class LoginActivityPresenter implements ILoginActivityContract.IPresenter {
}
这样还无法完成注入,还需要两个重要的东西(Module类和Component接口)
- 新建LoginActivityModule
@Module
public class LoginActivityModule {
private ILoginActivityContract.IView mView;
public LoginActivityModule(ILoginActivityContract.IView view){
mView = view;
}
@Provides
public ILoginActivityContract.IPresenter providerPresenter(){
return new LoginActivityPresenter();
}
}
这里使用了两个注解,作用是将Presenter实例化
- 新建ILoginActivityComponent接口
@Component(modules = LoginActivityModule.class)
public interface ILoginActivityComponent {
void inject(LoginActivity view);
}
- 最后Rebuild项目,会生成以Dagger为前缀的Component类,在Activity中完成依赖注入
DaggerILoginActivityComponent.builder()
.loginActivityModule(new LoginActivityModule(this))
.build()
.inject(this);
总结
- @Inject 带有此注解的属性或构造方法,Dagger2会实例化有此注解的类
- @Module 用来提供依赖,里面定义一些用 @Provides 注解的以 provider 开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖
- @Component 用来将 @Inject 和 @Module 连接起来的桥梁,从Module中获取依赖并将依赖注入给Inject
注意
- Activity中实现Contract接口中的View,Presenter中实现接口中的Presenter