Timi 13926ea24a add JavaFX demo application
- Add FxMain as JavaFX application entry with IOC integration
- Add FxConfig with @Bean factory methods for DateTimeFormatter
- Add MainController with constructor injection
- Add UserService and MessageService layers
- Add main.fxml view with user management UI
- Add javafx-fxml dependency and javafx-maven-plugin
- Add demo documentation and run script
- Demonstrate @Controller, @Service, @Qualifier, @PostConstruct in JavaFX context

Run with: mvn javafx:run or run-javafx-demo.bat

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-11 12:31:50 +08:00
2025-07-14 11:57:11 +08:00
2026-01-11 12:31:50 +08:00
2026-01-11 12:31:50 +08:00
2025-07-14 03:24:01 +00:00
2026-01-11 12:31:50 +08:00

timi-inject

Java 轻量级控制反转与依赖注入框架。

特性

  • 基于注解的依赖注入
  • 构造器注入为核心路径
  • 支持 @Configuration + @Bean
  • 支持 @Qualifier 与 @Primary
  • 支持 @Scopesingleton / prototype
  • 支持 @Import 与 Module 扩展
  • 支持 @PostConstruct 生命周期回调
  • 提供依赖图导出

引入依赖

Maven:

<dependency>
	<groupId>com.imyeyu.inject</groupId>
	<artifactId>timi-inject</artifactId>
	<version>0.0.1</version>
</dependency>

快速开始

  1. 定义应用入口
@TimiInjectApplication("com.example.demo")
public class DemoApp {
}
  1. 定义组件与配置
@Service
public class UserService {
	public String hello() {
		return "hi";
	}
}

@Configuration
public class DemoConfig {
	@Bean("appName")
	public String appName() {
		return "timi-inject";
	}
}
  1. 启动并获取 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
Description
Java 轻量控制反转工具
Readme MIT 119 KiB
v0.0.2 Latest
2026-01-19 10:06:38 +00:00
Languages
Java 97.5%
Batchfile 2.5%