Dagger2集成之环境配置及简单验证

1.1 配置Dagger2依赖关系

目前android应用的代码管理大多采用Gradle来做,但是在集成Dagger2的过程中,Gradle的版本与Dagger2的依赖方式存在一定的相关性,在网上一些介绍集成Dagger2的资料中,大多采用“com.neenbedankt.gradle.plugins:android-apt:1.4”来作为Dagger2的辅助依赖工具,而实际上对稍高一些版本的Gradle来说,要继续采用apt的方式对接Dagger会显得比较困难,而且对Gradle来说,也不建议再继续使用apt,而是推荐使用“annotationProcessor”的方式。

我们接下来在进行环境配置的时候也采用使用“annotationProcessor”的方式。

Android工程在通过Gradle进行代码管理的过程中,往往会使用2类build.gradle文件来进行依赖管理,其中一类是工程(project)级别的gradle配置,一类是App级别的gradle配置,分别位于工程根路径和工程的app路径下。

工程级build.gradle配置:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        classpath 'org.greenrobot:eventbus-annotation-processor:3.1.1' //增加依赖annotationProcessor
    }
}
​
allprojects {
    repositories {
        google()
        jcenter()
    }
}
​
task clean(type: Delete) {
    delete rootProject.buildDir
}

注,重点关注注释提示的代码配置

app级build.gradle配置:

apply plugin: 'com.android.application'
​
android {
    compileSdkVersion 30
    buildToolsVersion "31.0.0"
    defaultConfig {
        applicationId "com.tc.app.dagger2"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }
}
​
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
​
    // 开始增加Dagger2依赖关系
    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'//增加依赖annotationProcessor
    annotationProcessor 'com.google.dagger:dagger-compiler:2.40'// 指定注解处理器
    compileOnly 'org.glassfish:javax.annotation:10.0-b28'//添加android缺失的部分javax注解
    implementation 'com.google.dagger:dagger:2.40'// 指定依赖版本
    // Dagger2依赖关系添加结束
    
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

1.2 对Dagger2配置环境进行简单验证

1.2.1 新建Android项目,并配置Dagger2

新建一个简单的Android工程,并参考1.1章节中的配置介绍,对工程进行Dagger2依赖关系配置(此过程省略——应该能搞定哦)

1.2.2 编写验证代码

首先,编写等待进行依赖注入的业务代码(MyBusinessApiService)

package com.tc.app.dagger2.di;
​
import android.util.Log;
​
/**
 * 真实的业务处理服务
 *
 * @author min.weixm
 * @version $Id: MyBusinessApiService.java, v 0.1 2021/11/12 14:35 min.weixm Exp $
 */
public class MyBusinessApiService {
    public void register(){
        Log.i("----------------------------MyBusinessApiService--------------------","MyBusinessApiService");
    }
}

真实的业务处理类,通过打印日志的方式来验证Dagger2配置环境是否可以正常工作。

接下来,配置业务处理服务的实际实例化处理工具(MyBusinessApartModule)

package com.tc.app.dagger2.di;
​
import dagger.Module;
import dagger.Provides;
​
/**
 * 在这里对实际进行业务处理的组件进行实例化(如,对MyBusinessApiService进行实例化处理)
 *
 * @author min.weixm
 * @version $Id: MyBusinessApartModule.java, v 0.1 2021/11/12 14:38 min.weixm Exp $
 */
@Module
public class MyBusinessApartModule {
    @Provides
    public MyBusinessApiService provideMyBusinessApiService(){
        return new MyBusinessApiService();
    }
​
}

然后,声明我们的容器对接接口(MyApartComponent)

package com.tc.app.dagger2.di;
​
import com.tc.app.dagger2.MainActivity;
​
import dagger.Component;
​
/**
 * 不真正提供实例,真实实例由 MyBusinessApartModule 提供
 *
 * @author min.weixm
 * @version $Id: MyApartComponent.java, v 0.1 2021/11/12 14:40 min.weixm Exp $
 */
@Component(modules = {MyBusinessApartModule.class})
public interface MyApartComponent {
    void inject(MainActivity activity);
}

注:完成本操作后,需要唤醒Dagger2进行对接业务处理自动生成代码,因此,需要对工程执行一次build操作,这时,Dagger2会完成相应的代码自动生成动作

最后,我们做依赖注入的业务对接(MainActivity)

package com.tc.app.dagger2;
​
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
​
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
​
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.tc.app.dagger2.di.DaggerMyApartComponent;
import com.tc.app.dagger2.di.MyBusinessApiService;
​
import javax.inject.Inject;
​
public class MainActivity extends AppCompatActivity {
​
    /** 通过依赖注入的业务服务实例 */
    @Inject
    MyBusinessApiService myBusinessApiService;
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
​
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener((view) ->
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show()
        );
​
        //初始化环境,并完成功能调用
        DaggerMyApartComponent.create().inject(this);
        this.myBusinessApiService.register();
    }
​
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
​
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
​
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
​
        return super.onOptionsItemSelected(item);
    }
}

验证结果,在模拟器中run下app,观察运行日志:

I/----------------------------MyBusinessApiService--------------------: MyBusinessApiService
D/OpenGLRenderer: HWUI GL Pipeline
D/: HostConnection::get() New Host Connection established 0xa71e4380, tid 3631
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 1
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...

顺利得到业务组件的打印日志,说明本次Dagger2配置验证成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值