【Android】Dagger和Hilt新手快速入门
什么是Dagger和Hilt
Dagger和Hilt都是安卓端的依赖注入框架
通过注解生成的方式,来取代手动创建对象的方式,来管理对象和其作用域
Dagger是Square公司出品的,而Hilt是由Google公司在Dagger的基础上优化而来
配置项目级别gradle
buildscript {repositories {mavenLocal()maven { url 'https://jitpack.io' }maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/repository/releases' }google()mavenCentral()}dependencies {classpath "com.android.tools.build:gradle:4.2.2"classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'}}task clean(type: Delete) {delete rootProject.buildDir}
配置模块级别gradle
apply plugin: 'com.android.application'apply plugin: 'com.google.dagger.hilt.android'android {compileSdkVersion 30defaultConfig {applicationId "com.android.code"minSdkVersion 28targetSdkVersion 30versionCode 1versionName "1.1.1"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}buildFeatures {viewBinding truedataBinding true}}dependencies {api 'androidx.appcompat:appcompat:1.2.0'api 'com.google.android.material:material:1.3.0'api 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'//GSONapi 'com.google.code.gson:gson:2.8.7'//RxJava2api 'io.reactivex.rxjava2:rxjava:2.1.3'api 'io.reactivex.rxjava2:rxandroid:2.0.1'//Retrofit2api 'com.squareup.retrofit2:retrofit:2.3.0'api 'com.squareup.retrofit2:converter-gson:2.3.0'api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//Dagger2api 'org.glassfish:javax.annotation:10.0-b28'api "com.google.dagger:dagger:2.47"annotationProcessor "com.google.dagger:dagger-compiler:2.47"//Hiltapi 'com.google.dagger:hilt-android:2.44'annotationProcessor 'com.google.dagger:hilt-android-compiler:2.44'}
Hilt使用方式
由于Hilt是个Dagger基础上优化而来,因此使用方式比较相似
这里我们只讲解Hilt的使用方式,不再讲解Dagger
-
在Application上添加@HiltAndroidApp注解
-
在需要注入对象的组件,比如Activity或Fragment上,添加@AndroidEntryPoint注解
-
在需要注入对象的组件中,通过@Inject注解定义对象
-
在需要注入对象的默认构造方法上,添加@Inject注解
-
如果需要在某个作用域内共享对象,可以在类名上添加作用域注解,如@Singleton,@ActivityScoped,@ViewScoped等
-
如果希望注入对象,在其子组件中重新注入仍然生效,可以通过@Module注解定义一个专门的模块类
-
Module类需要通过@InstallIn指定安装到哪个组件中,Module类还需要提供一个方法,用于生产对象
-
Module类中用于生产对象的方法,需要添加作用域注解,和@Provides注解
-
Module类中,Method上的作用域注解,和InstallIn指定的组件,范围必须对应
Hilt参考代码
public class User extends BaseObservable {public String account;public String password;public String name;@Injectpublic User() {}@Overridepublic String toString() {return hashCode() + "";}}
@AndroidEntryPoint@SuppressWarnings("all")public class HomeActivity extends AppCompatActivity {@InjectUser user1;@InjectUser user2;}
@Module@InstallIn(ActivityComponent.class)public class UserModule {@ActivityScoped@Providespublic static User injectUser() {return new User();}}