Dagger2入门简记
来源:互联网 发布:2016淘宝链接降权恢复 编辑:程序博客网 时间:2024/05/17 23:15
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入门简记
- Dagger2入门
- dagger2入门
- Dagger2入门
- Dagger2入门
- Dagger2入门
- Dagger2 入门
- Dagger2入门
- Dagger2简单入门使用
- [Android] Dagger2 入门 1
- [Android] Dagger2 入门 2
- Dagger2配置与入门
- Dagger2 再菜鸟入门
- Dagger2入门详解
- Android开发Dagger2入门
- Android Dagger2简单入门
- Dagger2框架入门使用
- dagger2的简单入门
- Zygote调用流程分析
- 909422229_Jquery中对元素的添加
- highCharts(一)Highcharts 基本组成
- locationManager.getLastKnownLocation(locationProvider);//地理位置获取为null的解决方案
- python函数式编程之匿名函数lambda
- Dagger2入门简记
- com/alibaba/dubbo/common/bytecode/Wrapper0 has illegal signature "(V)V"
- 我的KVM显卡直通实践
- 共享经济已成资本傀儡,背后是腾讯和阿里的暗斗
- css实现-商城分类导航效果
- switch语句简单运用
- 总结/事务,视图
- RHadoop协同过滤算法
- java中的正则表达式