Skip to content
New issue

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(2) #34

Open
soapgu opened this issue May 2, 2021 · 0 comments
Open

Android的IoC(三)——初见Hilt(2) #34

soapgu opened this issue May 2, 2021 · 0 comments
Labels
Demo Demo IoC New feature or request 安卓 安卓

Comments

@soapgu
Copy link
Owner

soapgu commented May 2, 2021

这里也不再客套了,直接接龙Android的IOC(二)——初见Hilt(1)

  • 重点——对于原版Dagger的重大改进倒装式
    这里官挡里面相对轻描淡写

与 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的仓库里面。这个特性被很自然的继承过来了

  • Module的用例实现

首先写个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极大的简化了依赖提供端和依赖需求端
    依赖提供端:最简情况只要在构造函数上增加@Inject即可,对于@module则只需要告知装备到哪一层的Component和@provides什么依赖
    依赖需求端:只要@androidentrypoint标记,就开启了传送门。声明@Inject落地具体依赖

  • 把复杂的装配工作隐藏化
    我们在用户代码层已经没有了Component的概念,这些Hilt及Dagger帮忙自动生成代码都完成了。里面有复杂的依赖装配工作,Component组件父子级别关系等等。我们都不需要去关心,已经有人帮我们负重前行,我们可以放飞自我

我们用另一种理解的方式,就是依赖的两端像是开启了diablo传送门

@soapgu soapgu added Demo Demo IoC New feature or request 安卓 安卓 labels May 2, 2021
@soapgu soapgu changed the title Android的IOC(三)——初见Hilt(2) Android的IoC(三)——初见Hilt(2) Jul 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Demo Demo IoC New feature or request 安卓 安卓
Projects
None yet
Development

No branches or pull requests

1 participant