V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kekxv
V2EX  ›  Android

安卓模拟自动注入

  •  
  •   kekxv · 2020-12-28 13:26:21 +08:00 · 8206 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    安卓模拟自动注入

    源码位置 : https://github.com/kekxv/AndroidAutoWired

    代码下载 : AndroidAutoWired.zip

    引入方式: <del>gradle:implementation 'com.github.kekxv:AndroidAutoWired:0.2.1'</del> (不知道啥子情况,不起作用)

    更新记录

    • 20201226 增加Sign标记,用于区分各个不一样的实例。
    • 20201226 增加IAutoWired.registered手动注册,可用于自动注入Context之类。

    原理说明:

    1. 扫描所有带有 @Service 的自动注入类
    2. 手动或继承IAutoWired 自动调用 IAutoWired.inject(this); 进行注入。
    3. 为保证private也能注入成功;通过反射以及setAccessible(true);修改权限进行newInstance()以及赋值
    Constructor<?> constructor = cla.getDeclaredConstructor();
    constructor.setAccessible(true);
    constructor.newInstance()
    
    Field[] fields = source.getClass().getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
        field.set(source, target);
    }
    

    本项目是用于模拟自动注入,通过添加注解@AutoWired

    自动扫描包含@AutoWired注解对应的实例,并将其注入。

    如果变量类型为接口类,则需要有一个对应的继承类对应能初始化,用于注入。

    注意:所有自动注入的同类型类,为同一个对象。

    为了能够区分对应的自动注入实例 ,则需要添加注解@Service,方便AutoWired确认。

    使用方法

    先进行@AutoWired 以及 @Service 注解,或者使用IAutoWired.registered手动注册。

    安卓在使用的时候,需要在主入口类里面调用IAutoWired.init(this);用与初始化扫描本包下所有类。

    2 条回复    2020-12-28 13:44:01 +08:00
    kahlkn
        1
    kahlkn  
       2020-12-28 13:38:58 +08:00
    应该考虑的是实现 IOC 容器,在 IOC 容器中考虑 同接口 多实现怎么存怎么区分。 还有 循环依赖 比如 A 依赖 B,但是 B 又依赖 A 怎么解决。 还有 对象初始化 和 懒加载 。我觉得自动注入,仅仅是 IOC 容器中的一个功能。
    kekxv
        2
    kekxv  
    OP
       2020-12-28 13:44:01 +08:00
    @kahlkn 说的很对,后期有时间会参考这些,但是我这个主要是业务上需要,就弄了,另外发出来是希望能够有人帮助完善 [目前已经够用了,能够大幅度减少 getInstance()代码🐶] 以及希望能帮助到有需要的人。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 20:41 · PVG 04:41 · LAX 12:41 · JFK 15:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.