Dagger2依赖注入框架的使用简介

如何引入Dagger2

  1. 配置apt插件(在build.gradle(Project:xxx)中添加如下代码)

    dependencies {
          
          
        classpath 'com.android.tools.build:gradle:2.1.0'
        //添加apt插件
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  
    }
    
  2. 添加依赖(在build.gradle(Module:app)中添加如下代码)

    apply plugin: 'com.android.application'
    //添加如下代码,应用apt插件`
    apply plugin: 'com.neenbedankt.android-apt'
    ...
    dependencies {
          
          
       ...
       compile 'com.google.dagger:dagger:2.4'
       apt 'com.google.dagger:dagger-compiler:2.4'
       //java注解
       compile 'org.glassfish:javax.annotation:10.0-b28'
       ...
    }
    
  3. 别忘了加入lint warning

    android {
          
          
    		...
                
    lintOptions {
          
          
    	warning 'InvalidPackage'
    	}
    }
    

.

Dagger2的使用

需要被注入依赖的类

public class MainPresenter {
    
    
   //MainContract是个接口,View是他的内部接口,这里看做View接口即可
   private MainContract.View mView;
   
   @Inject
   MainPresenter(MainContract.View view) {
    
    
       mView = view;
   }    
   public void loadData() {
    
    
       //调用model层方法,加载数据
       ...
       //回调方法成功时
       mView.updateUI();
   }

作用:
@Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类

.

Module类

@Module
public class MainModule {
    
    
    private final MainContract.View mView;

    public MainModule(MainContract.View view) {
    
    
        mView = view;
    }

    @Provides
    MainView provideMainView() {
    
    
        return mView;
    }
}

作用:
@Module 带有此注解的类,用来提供依赖,里面定义一些用@Provides注解的以provide开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖。

.

Component接口

@Component(modules = MainModule.class)
public interface MainComponent {
    
    
    void inject(MainActivity activity);
}

作用:
@Component 用来将@Inject和@Module联系起来的桥梁,从@Module中获取依赖并将依赖注入给@Inject

在Activity中使用

public class MainActivity extends AppCompatActivity implements MainContract.View {
    
    

    @Inject
    MainPresenter mainPresenter;
    ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
         DaggerMainComponent.builder()
                .mainModule(new MainModule(this))//绑定Module,并传递Activity的view对象
                .build()
                .inject(this);
        //调用Presenter方法加载数据
         mainPresenter.loadData();
         
         ...
    }

}

我们先看MainActivity里的代码,之前是直接声明MainPresenter,现在在声明的基础上加了一个注解@Inject,表明MainPresenter是需要注入到MainActivity中,即MainActivity依赖于MainPresenter,这里要注意的是,使用@Inject时,不能用private修饰符修饰类的成员属性。

然后我们在MainPresenter的构造函数上同样加了@Inject注解。这样MainActivity里的mainPresenter与他的构造函数建立了某种联系。这种联系我们可以这样理解,当看到某个类被@Inject标记时,就会到他的构造方法中,如果这个构造方法也被@Inject标记的话,就会自动初始化这个类,从而完成依赖注入。

扫描二维码关注公众号,回复: 12354816 查看本文章

然后,他们之间并不会凭空建立起联系,因此我们想到,肯定需要一个桥梁,将他们连接起来,也就是下面要介绍的Component。

Component是一个接口或者抽象类,用@Component注解标注(这里先不管括号里的modules),我们在这个接口中定义了一个inject()方法,参数是Mainactivity。然后rebuild一下项目,会生成一个以Dagger为前缀的Component类,这里是DaggerMainComponent,然后在MainActivity里完成下面代码.

DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);

.

参考资料:

猜你喜欢

转载自blog.csdn.net/weixin_42324979/article/details/109571417