Files
timi-inject/README.md
Timi 71be7c07c0 implement lightweight IOC/DI framework
- 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>
2026-01-11 12:26:14 +08:00

200 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# timi-inject
Java 轻量级控制反转与依赖注入框架。
## 特性
- 基于注解的依赖注入
- 构造器注入为核心路径
- 支持 @Configuration + @Bean
- 支持 @Qualifier@Primary
- 支持 @Scopesingleton / prototype
- 支持 @Import 与 Module 扩展
- 支持 @PostConstruct 生命周期回调
- 提供依赖图导出
## 引入依赖
Maven:
```xml
<dependency>
<groupId>com.imyeyu.inject</groupId>
<artifactId>timi-inject</artifactId>
<version>0.0.1</version>
</dependency>
```
## 快速开始
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