Android(安卓)Dagger2 初学笔记
Android Dagger 2 初学笔记
- Android Dagger 2 初学笔记
- 前言
- 简介
- Module
- Component
- Activity
- 示例
- 实例化
- 添加依赖
- 注入
- 总结
前言
看了大部分的 Dagger 2 教程博客,大多都说的几点功能:
- 模块间解耦,提高代码的健壮性和可维护性
- 访问全局对象的实例方式更简单
- 方便进行测试
- 方便管理作用域
由于初学Android,对解耦、测试、作用域了解不是很深入,目前并没有用到相关内容,所以现在只了解清楚了它实例化对象的过程
本文就笔者实现基本的Dagger 2 依赖注入功能做一些记录
日后若有用到其他强大功能,再做记录说明(肯定会用到其他功能的)
直接结合MVP框架进行示例
简介
依赖注入 ( Dependency Injection简称 di ) 不做说明
在这里我将用框架实现Presenter
类在Activity
中的实例化
MVP初学笔记中的实现方法:
mPresenter = new MyPresenter(this);
这里引入一张图
(先抛开 Application 不讲)
由三部分组成:Module + Component + Activity
Module
负责实例化Presenter
类(@Provides
)
构造函数在Activity
中传参
将自身提供给Component
Component
规定作用域
依赖Module
定义注入方法,参数为目标类
Activity
定义Presenter
时加一个@Inject
注解
通过DaggerXXComponent.builder().Module()
完成对Module
的构造
通过DaggerXXComponent.inject(this)
完成注入
则Presenter
被实例化
看起来比原来的new方法来的复杂的多呀。。。
还有一些注解的使用在下文简单说明
示例
实例化
MyModule
@Modulepublic 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,日后再研究
更多相关文章
- Android菜单Menu的创建
- Android两种序列化方式详解(一):Serializable
- Android(安卓)使用Parcelable序列化对象
- [置顶] 我的Android进阶之旅------>Android实现数据存储技术
- Android(安卓)SQLite总结[转载]
- Android(安卓)Service的启动流程源码分析(8.0)
- Android应用程序组件Content Provider应用实例
- android 设定activity的进入和退出效果
- Android之service一些基础回顾