We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
这里也不再客套了,直接接龙Android的IOC(二)——初见Hilt(1)
与 Dagger 模块不同的是,您必须使用 @Installin 为 Hilt 模块添加注释,以告知 Hilt 每个模块将用在或安装在哪个 Android 类中。
第一次没学原版Dagger看这句话的时候是没有什么感觉的。但是学过Dagger后,会觉得这是一个重大特性。 为啥?
Dagger Component->Module,就是Component来决定我要ModuleA,ModuleB,bala……bala……,Module就是一个工具类,Module就是服从分配,哪个模块要我,我就去哪里
Hilt Module->Component,就是Module决定自己的命运,他想去哪里就去哪里,给予“极大”的主观能动性。相对来说Component变成了静态化,透明化,被动化。Module除了一个供应者的角色以外,还担当了输送者的角色
Hilt中Multibindings的实现 这是我非常担心的一点,因为官方文档并没有Hilt的Multibindings例子说明。但是Multibindings特性是IoC中的灵魂用例。毕竟对于接口抽象类的多态是一定会应用到的。在程序运行时决定工厂装配是很正常的想象,不可能接口时一对一焊死的。 好在虚惊一场。Hilt源代码就是和dagger放一个github的仓库里面。这个特性被很自然的继承过来了
首先写个IPrint接口
public interface IPrint { String output(); }
再写两个类实现多态
public class OnePrint implements IPrint { @Override public String output() { return "------Print from One--------"; } } public class TwoPrint implements IPrint { @Override public String output() { return "------Print from Two--------"; } }
Module的实现
@Module @InstallIn(ActivityComponent.class) public class SimpleModule { @Provides @IntoMap @StringKey("One") public static IPrint provideIPrint(){ return new OnePrint(); } @Provides @IntoMap @StringKey("Two") public static IPrint provideAnotherIPrint(){ return new TwoPrint(); } }
装配到ActivityComponent中,并提供两个类实现,导入到Map中
@AndroidEntryPoint public class MainActivity extends AppCompatActivity { @Inject SimpleExport simpleExportOne; @Inject SimpleExport simpleExportTwo; @Inject Map<String, IPrint> prints; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.i( "Get SimpleExport-simpleExportOne:%s",simpleExportOne.toString() ); Logger.i( "Get SimpleExport-simpleExportTwo:%s",simpleExportTwo.toString() ); Logger.i( "Print from print:%s",prints.get("One").output() ); Logger.i( "Print from print:%s",prints.get("Two").output() ); } }
MainActivity的实现,获取到IPrint所有的实现。通过实际需求去获取对应的实现
2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Thread: main 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Activity.performCreate (Activity.java:6679) 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ MainActivity.onCreate (MainActivity.java:31) 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Get SimpleExport-simpleExportOne:com.soapgu.hellohilt.SimpleExport@756745a 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: └──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.089 25168-25168/com.soapgu.hellohilt I/HelloHilt: ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Thread: main 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Activity.performCreate (Activity.java:6679) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ MainActivity.onCreate (MainActivity.java:32) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Get SimpleExport-simpleExportTwo:com.soapgu.hellohilt.SimpleExport@756745a 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: └──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Thread: main 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Activity.performCreate (Activity.java:6679) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ MainActivity.onCreate (MainActivity.java:33) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Print from print:------Print from One-------- 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: └──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Thread: main 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Activity.performCreate (Activity.java:6679) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ MainActivity.onCreate (MainActivity.java:34) 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: │ Print from print:------Print from Two-------- 2021-04-18 09:23:20.090 25168-25168/com.soapgu.hellohilt I/HelloHilt: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
使用 Hilt 实现依赖项注入
Multibindings
如图Hilt极大的简化了依赖提供端和依赖需求端 依赖提供端:最简情况只要在构造函数上增加@Inject即可,对于@module则只需要告知装备到哪一层的Component和@provides什么依赖 依赖需求端:只要@androidentrypoint标记,就开启了传送门。声明@Inject落地具体依赖
把复杂的装配工作隐藏化 我们在用户代码层已经没有了Component的概念,这些Hilt及Dagger帮忙自动生成代码都完成了。里面有复杂的依赖装配工作,Component组件父子级别关系等等。我们都不需要去关心,已经有人帮我们负重前行,我们可以放飞自我
我们用另一种理解的方式,就是依赖的两端像是开启了diablo的 传送门。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Hilt中的@module
这里也不再客套了,直接接龙Android的IOC(二)——初见Hilt(1)
这里官挡里面相对轻描淡写
第一次没学原版Dagger看这句话的时候是没有什么感觉的。但是学过Dagger后,会觉得这是一个重大特性。
为啥?
Dagger
Component->Module,就是Component来决定我要ModuleA,ModuleB,bala……bala……,Module就是一个工具类,Module就是服从分配,哪个模块要我,我就去哪里
Hilt
Module->Component,就是Module决定自己的命运,他想去哪里就去哪里,给予“极大”的主观能动性。相对来说Component变成了静态化,透明化,被动化。Module除了一个供应者的角色以外,还担当了输送者的角色
Hilt中Multibindings的实现
这是我非常担心的一点,因为官方文档并没有Hilt的Multibindings例子说明。但是Multibindings特性是IoC中的灵魂用例。毕竟对于接口抽象类的多态是一定会应用到的。在程序运行时决定工厂装配是很正常的想象,不可能接口时一对一焊死的。
好在虚惊一场。Hilt源代码就是和dagger放一个github的仓库里面。这个特性被很自然的继承过来了
Module的用例实现
首先写个IPrint接口
再写两个类实现多态
Module的实现
装配到ActivityComponent中,并提供两个类实现,导入到Map中
MainActivity的实现,获取到IPrint所有的实现。通过实际需求去获取对应的实现
参考链接
使用 Hilt 实现依赖项注入
Multibindings
总结
如图Hilt极大的简化了依赖提供端和依赖需求端
依赖提供端:最简情况只要在构造函数上增加@Inject即可,对于@module则只需要告知装备到哪一层的Component和@provides什么依赖
依赖需求端:只要@androidentrypoint标记,就开启了传送门。声明@Inject落地具体依赖
把复杂的装配工作隐藏化
我们在用户代码层已经没有了Component的概念,这些Hilt及Dagger帮忙自动生成代码都完成了。里面有复杂的依赖装配工作,Component组件父子级别关系等等。我们都不需要去关心,已经有人帮我们负重前行,我们可以放飞自我
我们用另一种理解的方式,就是依赖的两端像是开启了diablo的 传送门。
The text was updated successfully, but these errors were encountered: