71be7c07c08ea0ad1ece71bb493506d96c4ed8dc
- Add annotation system (@Component, @Service, @Configuration, @Bean, @Inject, @Qualifier, @Primary, @Scope, @PostConstruct, @Import, @TimiInjectApplication) - Implement BeanContext for managing bean instances and definitions - Implement BeanScanner for component scanning (file system and jar) - Implement BeanFactory with constructor injection and lifecycle support - Support @Configuration and @Bean factory methods - Support @Qualifier and @Primary for multi-implementation - Support @Scope (singleton/prototype) - Support @PostConstruct lifecycle callback - Support @Import and Module extension - Add circular dependency detection - Add dependency graph export - Add demo and test cases Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
timi-inject
Java 轻量级控制反转与依赖注入框架。
特性
- 基于注解的依赖注入
- 构造器注入为核心路径
- 支持 @Configuration + @Bean
- 支持 @Qualifier 与 @Primary
- 支持 @Scope(singleton / prototype)
- 支持 @Import 与 Module 扩展
- 支持 @PostConstruct 生命周期回调
- 提供依赖图导出
引入依赖
Maven:
<dependency>
<groupId>com.imyeyu.inject</groupId>
<artifactId>timi-inject</artifactId>
<version>0.0.1</version>
</dependency>
快速开始
- 定义应用入口
@TimiInjectApplication("com.example.demo")
public class DemoApp {
}
- 定义组件与配置
@Service
public class UserService {
public String hello() {
return "hi";
}
}
@Configuration
public class DemoConfig {
@Bean("appName")
public String appName() {
return "timi-inject";
}
}
- 启动并获取 Bean
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: 初始化回调
多实现与限定注入
@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 示例
@Component
@Primary
public class DefaultStorage implements Storage {}
@Configuration 与 @Bean 示例
@Configuration
public class AppConfig {
@Bean
public Clock clock() {
return Clock.systemUTC();
}
}
@Inject 示例
@Service
public class UserService {
private final UserRepository repo;
@Inject
public UserService(UserRepository repo) {
this.repo = repo;
}
}
@Import 与 Module
@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
TimiInject inject = TimiInject.run(DemoApp.class);
inject.ioc("runtimeConfig", new RuntimeConfig());
导出依赖图
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
运行方式:
mvn -DskipTests javafx:run
约束与建议
- 建议单一构造器,或显式使用 @Inject 标注
- 多实现时必须使用 @Qualifier 或 @Primary
- 避免在 @Bean 方法返回 null
v0.0.2
Latest
Languages
Java
97.5%
Batchfile
2.5%