什么是依赖注入?---朱凯
这些都属于由外部来提供依赖的初始化,所以都是依赖注入
Hilt 好不好用,我们先来看看它是个什么。它是个用注解来进行配置的依赖注入库。注解是它的写法,首先它是个依赖注入库,对吧?什么是依赖注入?一个类里有两个变量,这两个变量就是它的依赖:
总结:通过外部进行赋值
依赖注入的好处:数据共享
比如:activity。Prsenter,module里面都要用同一个user,可以通过hilt实现数据共享。
hilt和dragger2的区别
hilt:使用简单,然后是场景化,不是封装
dragger2:使用复杂
一个注解就能让 Activity 内部的依赖自动被注入,而 Dagger 需要手动注入,就是调用inject方法!
ButterKnife 或者现在 Jetpack 推出的 ViewBinding 它们提供的功能,Hilt 提供了吗?
不好意思,Hilt 不提供它们的功能。Hilt 和 Dagger 虽然用法和 ButterKnife 很像,都是给变量加注解,然后变量会自动赋值,但它们的功能定位是不一样的:Hilt 和 Dagger 是做依赖注入的,而 ButterKnife 和 ViewBinding 是做视图绑定的。
Hilt是对Dagger2的封装。就像retrofit是对okhttp的封装一样。
那么 Hilt 是什么呢?Hilt 是一个内部使用 Dagger 的库,只是简化了它的用法,因此我在这里所说的有关 Dagger 的内容也适用于 Hilt
相比于Dagger2,Hilt最明显的特征就是:1. 简单。2. 提供了Android专属的API。
Hilt原理:
1.dagger里面的apt
2.自动注入,通过字节码插桩 javaassist,在oncrate之前,用另外一个activity!
Hilt 做的优化包括
无需编写大量的Component代码
Scope也会与Component自动绑定
预定义绑定,例如 Application与Activity
预定义的限定符,例如@ApplicationContext与@ActivityContext
————————————————
应用实战:网络请求的多个框架,封装成了代理模式,然后可以改成依赖注入!!!!
里面有application,activity,Fragment的注解
Hilt 应用类
所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注释的 Application 类。
@HiltAndroidApp
class MyApplication:Application() {
}
生成的这一 Hilt 组件会附加到 Application 对象的生命周期,并为其提供依赖项。此外,它也是应用的父组件,这意味着,其他组件可以访问它提供的依赖项。我们查看生成的源码可以看到一个Hilt_MyApplication类,这是此注解生成类之一,它是hilt组建全局的管理者
将依赖项注入 Android 类=============(是入口吗)
在 Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注释的其他 Android 类提供依赖项,现在我们先在我们熟悉的MainActivity添加这个注释,看看会发生什么:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
可以使用注入框架进行实例的创建,不需要new
@Inject lateinit var user:User//定义一个User对线
实践:
第一步:添加依赖
根目录:
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
主目录:
apply plugin: 'dagger.hilt.android.plugin'
implementation "com.google.dagger:hilt-android:2.28-alpha"
annotationProcessor "com.google.dagger:hilt-android-compiler:2.28-alpha"
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 }</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">第二步:定义bean</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">
public class HttpObject {
}
</pre>
第三步:Module</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)
@Module public class HttpModule {
@Singleton
@Provides public HttpObject getHttpObject(){
return new HttpObject();
}
}
</pre>
同时把module安装到component里面去</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)</pre>
<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">第四步:使用:注入点</pre>
注入到Activity
<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@AndroidEntryPoint public class MainActivity extends AppCompatActivity {
@Inject
HttpObject httpObject; @Inject
HttpObject httpObject2; @Inject
public TestInterface testInterface; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); }</pre>
第五步:application中定义</pre>
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@HiltAndroidApp public class MyApplication extends Application {
}
</pre> </pre>
Hilt 接口的使用
原理:最终通过module实现!!!!!!
一个接口很多实现类,接口具体实现。
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public interface TestInterface {
void method(); }
</pre>
2、提供一个实现接口的对象
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public class TestClass implements TestInterface {
@Inject
TestClass() {
}
@Override
public void method() {
Log.i("TestClass", "TestClass注入成功!");
}
}
</pre>
3、编写对应Module
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Module @InstallIn(ActivityComponent.class)
public abstract class TestInterfaceModule {
// @Binds // public abstract TestInterface bindTestClass(TestClassTwo testClass //实现不同的 功能); @Binds
public abstract TestInterface bindTestClass(TestClass testClass); }
</pre>
4、最终使用
<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Inject public TestInterface testInterface; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); </pre>
hilt对项目的一个封装(jetpack-hilt-flow-mvvm 超简洁实战项目)
https://www.jianshu.com/u/cf8709c5d63a
recycleView
https://www.jianshu.com/p/a1f21380a43d
https://www.jianshu.com/p/fd4f090c882e---朱凯视频
https://juejin.cn/post/6978407567047262222?share_token=d66a5860-52fe-4257-93d4-7bca921e8be3
https://juejin.cn/post/6902009428633698312?share_token=35134c40-3d98-47cf-95a0-1ec670f6bdca
demo: