< 返回版块

zooshee 发表于 2025-08-06 11:14

Tags:依赖注入, dependency-injection, DI, IoC,framework

Verdure

Hi,各位巨佬大家好,Verdure是我新开发的框架,正如它的名字Verdure一样愿景为充满朝气,生气勃勃的一个生态化框架,致力于能提供便捷的Rust开发。

作为一名Java编程经验有十年之余的老码工,也浸淫Rust有四年左右的时间了,最近在使用Rust做一些企业的Web项目,深感目前生态匮乏,但不要紧我们来一起建设它(深爱Rust的狂热份子),好的crate未来我会做成starter整合自动化配置开箱即用,没有好的我们就自己写,我也期待Verdure能够建设成像Java中生态的Spring项目成为开发中不可或缺的一部分,尽管才刚刚起步但不要紧我们有热爱。

目前处于基础底座的打造期,期待有志之士加入一起做这件事。

特性

  • IOC容器及容器事件监听
  • 依赖注入(DI)
  • 自动化配置
  • AOP
  • Context
  • 更多.....

引入依赖

verdure = "0.0.1"
inventory = "0.3"

底层目前强依赖于inventory,感谢这个优秀的Repo。

IoC / DI

初始化容器

use std::sync::Arc;

fn init_container() {
    let container = ComponentContainer::new();
    match container.initialize() {
        Ok(_) => Arc::new(container),
        Err(e) => panic!("Failed to initialize container {}", e)
    }
}

注册组件(Component)

自动注册及注入(Drive)

在结构体上添加Component宏会自动将一个struct注册至容器中,默认为单例,对于添加了#[autowired]的字段会自动从容器中获取实例并进行注入。

use verdure::Component;


#[derive(Component)]
struct TestA {
    #[autowired]
    test_b: Arc<TestB>,
    test_c: Option<TestC>,
    test_d: TestD
}

#[derive(Component)]
struct TestB {
    a: i32,
    b: i32,
}

struct TestC {
    a: i32
}

#[derive(Default)]
struct TestD {
    a: i32,
}

需要注意的事项有二点:

  • 被注入的字段必须是Arc<T>包装
  • 对于不需要注入的字段则需要它们是Option<T>或已实现Default特性

手动注册及获取组件

#[derive(Debug)]
struct Config {
    name: &'static str,
    port: u16
}

fn main() {
    let container = init_container();
    container.register_component(Arc::new(config));
    let config = container.get_component::<Config>().unwrap();
    println!("config: {:?}", config);
}

容器事件监听

使用宏的方式

fn handle_container_lifecycle(event: &ContainerLifecycleEvent) {
    match event {
        ContainerLifecycleEvent::InitializationStarted {
            container,
            component_count,
        } => {
            // 可以在此处注册初始化时必要的组件
        }
        ContainerLifecycleEvent::InitializationCompleted {
            container: _,
            component_count,
            duration,
        } => {
            println!(
                "容器初始化完成\n组件数量: {}\n耗时: {:?}",
                component_count, duration
            );
        }
        ContainerLifecycleEvent::ComponentCreated {
            container: _,
            component_name,
            component_type_id,
            creation_duration,
        } => {
            println!(
                "组件创建完成:\n名称: {}\n类型ID: {:?}\n创建耗时: {:?}",
                component_name, component_type_id, creation_duration
            );
        }
    }
}
lifecycle_listener!("app_container_listener", handle_container_lifecycle);

向诸位求一个Star,你的Star就是对我最好的支持! Verdure

评论区

写评论
Nayaka 2025-08-08 11:27

你一个老兵还能把Autowired写错?🤣

--
👇
Bruce: 点个赞,同为Java老兵,但是是Rust小白,看到Autoired 就亲切

Bruce 2025-08-06 15:28

点个赞,同为Java老兵,但是是Rust小白,看到Autoired 就亲切

None 2025-08-06 14:03

有个小建议,可以把 rust 好的组件包装到 java 里面去

1 共 3 条评论, 1 页