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入门简记的主要内容,如果未能解决你的问题,请参考以下文章

最简单的Dagger2入门教程

Dagger2入门详解

Dagger2从入门到放弃再到恍然大悟

Dagger2从入门到放弃再到恍然大悟

Android Dagger2简单入门

Android Dagger2简单入门