Dagger2入门简记
Posted 劲火星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dagger2入门简记相关的知识,希望对你有一定的参考价值。
Dagger2概念
注入的概念
依赖注入:就是目标类(目标类需要进行依赖初始化的类,下面都会用目标类一词来指代)中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建,而是通过技术手段可以把其他的类的已经初始化好的实例自动注入到目标类中。
Inject
我们可以用注解(Annotation)来标注目标类中所依赖的其他类,同样用注解来标注所依赖的其他类的构造函数,那注解的名字就叫Inject
class A
@Inject
B b;
class B
@Inject
B()
Component
通俗点来将component就是注解类和被注解类之间的桥梁,他通常是一个接口。注解类也就是上面B类中的构造函数,被注解类也就是上面A类中的得到的B类的实例。
Moudle
现在有个新问题:项目中使用到了第三方的类库,第三方类库又不能修改,所以根本不可能把Inject注解加入这些类中,这时我们的Inject就失效了。
@Module
public class ModuleClass
//A是第三方类库中的一个类
A provideA()
return A();
Module其实是一个简单工厂模式,Module里面的方法基本都是创建类实例的方法。也即是说Moudle是Component的提供者。
Provides
那Moudle和Component之间怎么建立联系呢,那就要通过Provides了
Module中的创建类实例方法用Provides进行标注,Component在搜索到目标类中用Inject注解标注的属性后,Component就会去Module中去查找用Provides标注的对应的创建类实例方法,这样就可以解决第三方类库用dagger2实现依赖注入了。
整个注入流程
- 如果有第三方库的使用,首先要建立Moudle
- 然根据Moudle来建立Component
- 通过Inject来进行注解,一个是注解提供类构造函数,一个是注解目标类的实例,这样就建立了联系
简单例子
引入资源
在project的build.gradle中
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
在app/build.gradle中
dependencies
...
// Add Dagger dependencies,2017.04.26
compile 'com.google.dagger:dagger:2.11-rc1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11-rc1'
IPresenter和IView
public interface IView
/**
* 更新UI
* @param data
*/
void updateUi(String data);
public interface IPresenter
/**
* 加载数据
*/
void loadData();
MyPresenter实现IPresenter接口
public class MyPresenter implements IPresenter
private IView mainView;
public MyPresenter(IView view)
mainView = view;
@Override
public void loadData()
mainView.updateUi("Mvp Update UI "+System.currentTimeMillis());
MyModule类
注意这里的MyPresenter的创建需要依赖View,而这个View是通过Moudle的构造方法传过来的。
@Module
public class MyModule
private IView mainView;
public MyModule(IView mainView)
this.mainView = mainView;
@Provides
public MyPresenter provideMyPresenter()
return new MyPresenter(mainView);
AppComponent类
派生到我的代码片
@Component(modules = MyModule.class)
public interface AppComponent
void inject(MainActivity activity);
MainActivity
public class MainActivity extends AppCompatActivity implements IView, View.OnClickListener
@Bind(R.id.result)
TextView tv_result;
@Bind(R.id.btn_update)
Button btn_update;
@Inject
MyPresenter myPresenter; //获取依赖的对象
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
btn_update.setOnClickListener(this);
DaggerAppComponent.builder()
.myModule(new MyModule(this))
.build()
.inject(this); //注入
@Override
public void updateUi(String data)
tv_result.setText(data);
@Override
public void onClick(View v)
switch (v.getId())
case R.id.btn_update:
myPresenter.loadData();
break;
实现效果
UI页面中是一个TextView和一个Button,当我们点击Button的时候就会改变TextView的值。
项目的步骤如下
- 首先建立moudle,moudle的初始话需要传入一个View,也就是我们这里的Activity,moudle初始化一个presenter并通过provide提供给component
- 初始化component,这里需要依赖moudle
- make我们的project并进行注入的操作
- 然后就可以调用注入的presenter进行操作了
尊重作者,尊重原创, 参考文章
http://www.jianshu.com/p/05ad9ad8a3e8
http://blog.csdn.net/javine/article/details/52787990
以上是关于Dagger2入门简记的主要内容,如果未能解决你的问题,请参考以下文章