
单例还是每次全新SimpleIoc实例生命周期与缓存策略完整指南【免费下载链接】simpleiocsimpleioc是一款基于反射的依赖注入容器。IOC容器允许注册类型和创建实例而不必直接在代码中创建对象实例这有助于降低代码间的耦合度提高代码的模块化和可测试性。项目地址: https://gitcode.com/Cangjie-SIG/simpleiocSimpleIoc 是一款面向仓颉语言的轻量级依赖注入容器IOC 容器让注册类型和创建实例解耦。本文带你完整掌握它的实例生命周期与缓存策略注册后实例何时创建、单例与多实例如何切换、何时该用无缓存模式以及如何把实例从缓存中移除与销毁。 先搞懂 SimpleIoc注册、解析、销毁三步走简单说你把需要哪些类型告诉 SimpleIoc由它负责创建和管理实例代码之间不必直接new对象耦合度更低、更容易测试。它的核心行为可以概括为 3 步注册register——声明某类型由哪个类提供、用哪个构造函数解析getInstance——按类型或键值从容器获取实例销毁unregister / reset——移除缓存实例或清空整个容器核心实现位于 simple_ioc.cj内部用一张类型 → 键 → 实例的映射表_instancesRegistry完成实例缓存这是理解一切生命周期行为的基础。⏱️ 实例何时创建默认懒加载也可立即创建注册不等于创建。register系列方法的createInstanceImmediately参数默认为false// 只注册不创建实例懒加载推荐 SimpleIoc.default.registerTestClass1() // 注册并立即创建实例 SimpleIoc.default.registerTestClass1(true)注册方式实例创建时机适用场景registerT()默认首次getInstance时才创建大多数场景应用启动更快registerT(true)注册时立即创建需要预加载、提前暴露构造错误测试文件 simpleIoc_test_creation_time_test.cj 验证了这一点注册后实例计数为 0第一次获取时才变为 1。 单例还是每次全新两种获取模式对比这是本文的核心。SimpleIoc 提供三类获取实例的 API缓存行为各不相同API缓存行为结果getInstanceT()✅ 缓存单例首次创建之后每次返回同一实例getInstanceT(key)✅ 按键值各自缓存不同 key 各得一个独立实例getInstanceWithoutCachingT()❌ 不缓存每次调用都创建全新实例// 单例两次调用拿到的是同一个对象 var a SimpleIoc.default.getInstanceTestClass1() var b SimpleIoc.default.getInstanceTestClass1() // 每次全新两个对象互不相同 var c SimpleIoc.default.getInstanceWithoutCachingTestClass1() var d SimpleIoc.default.getInstanceWithoutCachingTestClass1()键值 实例槽位未传 key 时容器内部使用一个随机 GUID 作为默认键因此同一类型可以默认单例 多个命名实例并存var x SimpleIoc.default.getInstanceTestClass1(db-primary) var y SimpleIoc.default.getInstanceTestClass1(db-replica) // x、y 与默认实例是三个互不相同的对象 实例的生命周期从缓存中移除到彻底清空实例不是拿到就永远在。SimpleIoc 提供了完整的生命周期管理手段移除单个实例unregister(instance)只清掉缓存类型注册仍在下次getInstance会重新创建一个新实例simpleIoc_test_unRegistration_test.cj 验证了两次获取的对象标识不同按类型或键注销unregisterT()/unregisterT(key)注销整个类型后再次获取会抛出异常一键重置reset()清空全部注册、工厂与缓存测试中常用它隔离用例状态检查isRegisteredT()看类型是否注册containsCreatedT()看实例是否已创建二者分离方便诊断生命周期问题var i1 SimpleIoc.default.getInstanceTestClass1() SimpleIoc.default.unregister(i1) // 仅移除该实例 var i2 SimpleIoc.default.getInstanceTestClass1() // 拿到的是全新实例 自动注入时的生命周期联动当一个类有多个构造函数时SimpleIoc 通过Principal注解选出主构造函数创建实例时其构造参数会递归地从容器中解析示例见 stubs.cj 中的TestClass5。⚠️ 注意递归解析走的是带缓存的获取路径所以依赖对象天然是单例——A和B都依赖Service时它们拿到的是同一个Service实例。如果你需要每次全新请显式使用getInstanceWithoutCaching。✅ 缓存策略最佳实践速查场景推荐做法全局配置、数据库连接等共享资源getInstanceT()单例缓存需要多个独立实例多连接池等getInstanceT(key)命名实例工具对象、一次性任务、需要全新状态getInstanceWithoutCachingT()单元测试间隔离reset()或unregister清理 快速开始git clone https://gitcode.com/Cangjie-SIG/simpleioc cd simpleioc cjpm update cjpm build完整接口列表与功能示例见 README.md缓存行为的测试用例可参考 simpleIoc_test_creation_time_test.cj 和 simpleIoc_test_unRegistration_test.cj。一句话总结默认单例、按键隔离、无缓存即全新——搞懂这三种模式SimpleIoc 的实例生命周期就尽在掌握。【免费下载链接】simpleiocsimpleioc是一款基于反射的依赖注入容器。IOC容器允许注册类型和创建实例而不必直接在代码中创建对象实例这有助于降低代码间的耦合度提高代码的模块化和可测试性。项目地址: https://gitcode.com/Cangjie-SIG/simpleioc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考