V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kekxv
V2EX  ›  程序员

安卓开发新方式

  •  
  •   kekxv · 2021-01-27 21:24:01 +08:00 · 2100 次点击
    这是一个创建于 1415 天前的主题,其中的信息可能已经有所发展或是发生改变。

    安卓模拟自动注入

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

    代码下载 : AndroidAutoWired.zip

    API 文档参照 API

    仓库 : Repo

    引入方式 : Introduce

    使用方式 : Usage

    更新记录

    • 20210127 修复 interface 接口包含变量没有注入问题。

    • 20210126 修复重复依赖陷入无限回调的问题。

    • 20210126 增加 Interpretation 用于 多个 interface 继承类型判断注入对象。

    • 20210124 修复重复依赖陷入无限回调的问题。

    • 20210124 增加 InjectView 自动findViewById并赋值;需要 setContentView 之后调用。

    • 20210114 增加Serviceservice标记,用于开启调用start()

    • 20210114 自动注入后注入,可在更新之后自动注入之前未找到的注入字段。

    • 20210114 在原有自动扫描的基础上,增加手动传入 Service 类。

    • 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,举个例子:Usage

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

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

    不足之处

    1. 目前还是有些不足的地方 <del>,例如当有多个实现类,希望能够根据指定参数或者指定注解,自动注入不一样的实现类,从而更灵活智能,但这个只能看后期项目需求或者是否有时间以及是否有好心人帮忙完善了</del>(已在 0.2.6 版本加上)。
    2. DexFile已经被 API 29 以上列为过时(Deprecated),这个在扫描当前类时候用上,需要寻找一个替换方案。不过在虚拟机Android11上面能够正常使用。

    参考文档

    仿 springboot @Autowired 自动注入:https://blog.csdn.net/qq_38527695/article/details/104217397

    其他互联网文档

    备注:由于找资料比较多和杂,部分资料查看后关闭页面,导致没有加入到参考文档内,如果您发现本文章内有借鉴您的文档的部分,请将您的文献地址提交Issues或者提交 PR(pull requests)到https://github.com/kekxv/AndroidAutoWired

    第 1 条附言  ·  2023-09-04 22:21:34 +08:00
    • 20230901 增加 http 服务,基于 NanoHTTPD ,使用@Controller("路径")和@RequestMapping({"/方法"})方式指定 。
    3 条回复    2021-01-27 23:33:11 +08:00
    kwanzaa
        1
    kwanzaa  
       2021-01-27 22:40:47 +08:00
    参考学习下。Kotlin OK 吗?
    twoyuan
        2
    twoyuan  
       2021-01-27 22:58:55 +08:00
    为什么不用主流的 Dagger 或者 Koin 呢

    Dagger 现在一有 Hilt API 提高易用性,二有 Android Studio 官方插件支持的跳转;
    Kotlin 下有 Koin,API 足够简洁易用,并且对 Java 支持也很好
    kekxv
        3
    kekxv  
    OP
       2021-01-27 23:33:11 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2321 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.