# timi-inject Java 轻量级控制反转与依赖注入框架。 ## 特性 - 基于注解的依赖注入 - 构造器注入为核心路径 - 支持 @Configuration + @Bean - 支持 @Qualifier 与 @Primary - 支持 @Scope(singleton / prototype) - 支持 @Import 与 Module 扩展 - 支持 @PostConstruct 生命周期回调 - 提供依赖图导出 ## 引入依赖 Maven: ```xml com.imyeyu.inject timi-inject 0.0.1 ``` ## 快速开始 1) 定义应用入口 ```java @TimiInjectApplication("com.example.demo") public class DemoApp { } ``` 2) 定义组件与配置 ```java @Service public class UserService { public String hello() { return "hi"; } } @Configuration public class DemoConfig { @Bean("appName") public String appName() { return "timi-inject"; } } ``` 3) 启动并获取 Bean ```java public static void main(String[] args) { TimiInject inject = TimiInject.run(DemoApp.class); UserService userService = inject.di(UserService.class); String appName = inject.di("appName", String.class); } ``` ## 注解说明 组件注解(类上): - @Component - @Service - @Controller - @Resources - @Util 配置注解: - @Configuration: 配置类 - @Bean: 定义 Bean 工厂方法 - @Import: 引入外部配置或组件 依赖注入: - 默认构造器注入 - @Inject: 指定构造器 - @Qualifier: 按名称限定注入 - @Primary: 多实现时优先注入 作用域: - @Scope(ScopeType.SINGLETON) - @Scope(ScopeType.PROTOTYPE) 生命周期: - @PostConstruct: 初始化回调 ## 多实现与限定注入 ```java @Component("fastStorage") public class FastStorage implements Storage {} @Component("defaultStorage") public class DefaultStorage implements Storage {} @Service public class ReportService { private final Storage storage; public ReportService(@Qualifier("fastStorage") Storage storage) { this.storage = storage; } } ``` ## @Primary 示例 ```java @Component @Primary public class DefaultStorage implements Storage {} ``` ## @Configuration 与 @Bean 示例 ```java @Configuration public class AppConfig { @Bean public Clock clock() { return Clock.systemUTC(); } } ``` ## @Inject 示例 ```java @Service public class UserService { private final UserRepository repo; @Inject public UserService(UserRepository repo) { this.repo = repo; } } ``` ## @Import 与 Module ```java @TimiInjectApplication("com.example.demo") @Import({ExternalConfig.class, DemoModule.class}) public class DemoApp { } public class DemoModule implements Module { @Override public void configure(BeanContext context) { // 手动注册 BeanDefinition 或外部单例 } } ``` ## 手动注册 Bean ```java TimiInject inject = TimiInject.run(DemoApp.class); inject.ioc("runtimeConfig", new RuntimeConfig()); ``` ## 导出依赖图 ```java String graph = inject.exportDependencyGraph(); System.out.println(graph); ``` ## JavaFX 示例 测试目录下提供独立 JavaFX demo: - 入口: `src/test/java/com/imyeyu/inject/javafxdemo/FxMain.java` - 配置: `src/test/java/com/imyeyu/inject/javafxdemo/FxConfig.java` 运行方式: ```bash mvn -DskipTests javafx:run ``` ## 约束与建议 - 建议单一构造器,或显式使用 @Inject 标注 - 多实现时必须使用 @Qualifier 或 @Primary - 避免在 @Bean 方法返回 null