看了大部分的 Dagger 2 教程博客,大多都说的几点功能:
由于初学Android,对解耦、测试、作用域了解不是很深入,目前并没有用到相关内容,所以现在只了解清楚了它实例化对象的过程
本文就笔者实现基本的Dagger 2 依赖注入功能做一些记录
日后若有用到其他强大功能,再做记录说明(肯定会用到其他功能的)
直接结合MVP框架进行示例
依赖注入 ( Dependency Injection简称 di ) 不做说明
在这里我将用框架实现Presenter
类在Activity
中的实例化
MVP初学笔记中的实现方法:
mPresenter = new MyPresenter(this);
这里引入一张图
(先抛开 Application 不讲)
由三部分组成:Module + Component + Activity
负责实例化Presenter
类(@Provides
)
构造函数在Activity
中传参
将自身提供给Component
规定作用域
依赖Module
定义注入方法,参数为目标类
定义Presenter
时加一个@Inject
注解
通过DaggerXXComponent.builder().Module()
完成对Module
的构造
通过DaggerXXComponent.inject(this)
完成注入
则Presenter
被实例化
看起来比原来的new方法来的复杂的多呀。。。
还有一些注解的使用在下文简单说明
MyModule
@Module
public class MyModule {
private Context mContext;
/**
* 构建MyModule时,将Context传进来
* @param mContext 这里指MyActivity
*/
public MyModule(Context mContext) {
this.mContext=mContext;
}
@Singleton
@Provides
MyPresenter providerMyPresenter(){
return new MyPresenter(mContext);
}
}
Module类一定要有@Module
注解
返回实例化的方法上要有@Provides
注解,方法名一般为provideXXPresenter()
@Singleton
的理解还不够清晰,日后再做解释
MyComponent
@Singleton
@Component(modules = MyModule.class)
public interface MyComponent {
void inject(MyActivity activity);
}
Component类一定要有@Component
注解,并且参数 modules 设置为要添加的Module类
这里定义注入方法(一般为)inject
,参数为Activity类
下面要做的就是在Activity类中调用这个方法实现注入(实例化)
MyActivity
public class MyActivity extends AppCompatActivity implements MyView{
ImageView helloIv;
@Inject
MyPresenter mPresenter;//在MyModule中provide的实例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
helloIv=findViewById(R.id.iv_helloimg);
//Dagger注入 实例化
DaggerMyComponent.builder()
.myModule(new MyModule(this))
.build()
.inject(this);
mPresenter.onCreate();
mPresenter.attachView(this);//绑定View并且实现方法
//mPresenter.getImage();
//TODO
}
在要实例化的类 定义时添加注解@Inject
完成之前的
Module
以及Component
的创建后,build操作一下,框架会自动生成一个DaggerXXXComponent
类(这里是DaggerMyComponent
)
对Module类进行传参构造(参数实际上为Presenter
服务)
.builder().myModule(new MyModule(this)).build()
实现注入(调用inject()
方法)
.inject(this)
到这里就算是完成了整个过程,之后就可以直接使用@Inject
注解定义的实体(Presenter
)了
这里只是一种比较基础(小白)的 Dagger 2 实现的方式
观察Google官方代码的话,应该有更具体(牛逼)的方式实现
一般Dagger 2与MVP结合使用
(Google的Demo是真的很到位)
Google Android MVP + Dagger 2 Demo
学习过程中看过的博客:
- Google官方MVP + Dagger2架构讲解
- Android快速依赖注入框架Dagger2使用1 这个博主有很多Android相关文章,都还不错
好像还有一个Dagger 2应用于Android的完美扩展库dagger.android,日后再研究