## 简化版rudi
## author: leijmdas
## 参考goweb3.git/godi
rust rudi目录代码说明
15:38
Read 14 files, Browsed 1 folder
rudi 目录代码说明
rudi 是 ruwebframe 项目中的 依赖注入(Dependency Injection, DI) 子模块,对标 Java 中 Spring IoC 容器的设计思想,用 Rust 实现了一个轻量级的 Bean 管理容器。
目录结构
src/rudi/
├── mod.rs # 模块入口
├── di_example.rs # 示例:演示注册+获取Bean
├── rucontainer/ # 核心容器
│ ├── mod.rs
│ ├── rucontainer.rs # Container 容器实现
│ └── ruregister.rs # 全局注册门面(静态容器)
├── di_factroy/ # 工厂层(预留扩展点)
│ ├── mod.rs
│ ├── di_factroy.rs # DiFactroy 占位结构
│ ├── di_test.rs # 针对di_template的测试
│ └── fatory_test.rs
├── di_template/ # 代码模板生成物(示例)
│ ├── mod.rs
│ ├── struct_init.rs # 示例:用 ctor 自动注册
│ └── di_test.rs
└── di_trait/ # 容器抽象trait
├── mod.rs
└── ditrait.rs # BeanRegistry trait
核心模块解析
1. rucontainer/rucontainer.rs — IoC 容器本体
Entry 枚举:容器中存储的条目类型
Factory:多例,每次 get 都调用工厂创建新实例
Singleton:单例,首次 get 时创建并缓存(Mutex<Option<Arc<dyn Any>>>)
Container 结构体:持有 HashMap<String, Entry>
register() / register_singleton():注册工厂函数
get():获取多例(需要 T: Clone)
get_singleton():获取单例,返回 Arc<T>(零拷贝共享)
get_bean():统一入口,自动根据 Entry 类型判断是单例还是工厂
is_singleton():查询某个 key 是否为单例
自动注册机制:
Reg 结构体 + inventory::collect! 实现编译期收集
bootstrap() 在容器初始化时扫描所有 inventory::submit! 的注册项
两个 macro_rules! 宏:register_singleton! / register_transient!,一行完成声明式注册
2. rucontainer/ruregister.rs — 全局静态门面
通过 OnceLock<RwLock<Container>> 提供全局唯一的容器实例:
global() 懒加载初始化容器,并自动调用 bootstrap() 完成所有 bean 的自动注册
对外暴露全局函数:register、register_singleton、get、get_singleton、get_bean
业务代码可在任意位置直接调用 ruregister::get_bean::<T>(key) 获取 Bean
3. di_trait/ditrait.rs — 容器抽象层
定义 BeanRegistry trait,规范容器行为:
register() / register_singleton() / get_bean()
通过 trait 抽象便于后续替换实现、做 mock 测试
4. di_template/struct_init.rs — 代码模板产物示例
展示了如何配合 ctor crate 实现启动时自动注册:
Rust
#[ctor(unsafe)]
pub fn register_bean_database() {
ruregister::register_singleton(SingleBeanName, Database::new);
}
程序启动时 ctor 自动执行该函数,把 Database 单例注册进全局容器。
5. di_factroy/ — 工厂扩展层
DiFactroy 目前为占位结构体,预留了按包路径扫描、自动生成 Bean 的扩展点
目录下测试文件演示如何通过模板生成的 struct_init 模块调用 Bean
6. di_example.rs — 完整使用示例
演示了两种注册方式 + 三种获取方式的对比:
多例每次 id 不同,单例 id 相同
同时展示了手动注册 + #[ctor] 自动注册两种风格
设计亮点
特性 实现方式
单例/多例共存 Entry 枚举区分,get_bean 统一入口
类型安全 Any + downcast,编译期泛型保证
线程安全 Arc + Mutex + RwLock + OnceLock
零配置启动注册 ctor + inventory 实现编译期收集
全局访问 OnceLock 静态容器,任意位置可取 Bean
调用链总结
Plain Text
业务代码
→ ruregister::get_bean::<Database>("xxx")
→ global() // 懒加载OnceLock
→ bootstrap() // 扫描 inventory 注册项
→ Container::get_bean()
→ Entry::Singleton / Entry::Factory
→ 返回 Arc<T>
整体上 rudi 模块实现了一个轻量、线程安全、支持声明式注册的 Rust IoC 容器,是整个 ruwebframe 框架的基础设施之一。