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配置验证成功。