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

原创粉丝点击