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>
This commit is contained in:
Timi
2026-01-11 12:31:50 +08:00
parent 71be7c07c0
commit 13926ea24a
9 changed files with 588 additions and 0 deletions

170
javafx-demo.md Normal file
View File

@ -0,0 +1,170 @@
# JavaFX 示例说明
这是一个完整的 JavaFX 应用示例,展示如何在 JavaFX 中使用 Timi-Inject IOC/DI 框架。
## 项目结构
```
src/test/java/com/imyeyu/inject/javafxdemo/
├── FxMain.java # JavaFX 应用入口
├── FxConfig.java # 配置类 (@Configuration)
├── MainController.java # 主界面控制器 (@Controller)
├── UserService.java # 用户服务 (@Service)
└── MessageService.java # 消息服务 (@Service)
src/test/resources/javafxdemo/
└── main.fxml # 主界面 FXML 文件
```
## 核心特性展示
### 1. IOC 容器初始化
```java
@TimiInjectApplication("com.imyeyu.inject.javafxdemo")
@Import(FxConfig.class)
public class FxMain extends Application {
private static TimiInject inject;
public static void main(String[] args) {
// 启动 IOC 容器
inject = TimiInject.run(FxMain.class);
// 启动 JavaFX 应用
launch(args);
}
}
```
### 2. 控制器工厂集成
```java
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/javafxdemo/main.fxml"));
// 使用 IOC 容器作为控制器工厂
loader.setControllerFactory(type -> inject.di(type));
Parent root = loader.load();
// ...
}
```
### 3. 构造器依赖注入
```java
@Controller
public class MainController {
private final UserService userService;
private final MessageService messageService;
// 构造器注入
public MainController(UserService userService, MessageService messageService) {
this.userService = userService;
this.messageService = messageService;
}
}
```
### 4. @Bean 工厂方法
```java
@Configuration
public class FxConfig {
@Bean
public DateTimeFormatter dateTimeFormatter() {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
}
@Bean("appTitle")
public String appTitle() {
return "Timi-Inject JavaFX Demo";
}
}
```
### 5. @Qualifier 限定注入
```java
@Service
public class MessageService {
private final String appTitle;
private final String version;
public MessageService(@Qualifier("appTitle") String appTitle,
@Qualifier("version") String version) {
this.appTitle = appTitle;
this.version = version;
}
}
```
### 6. @PostConstruct 生命周期
```java
@Service
public class UserService {
@PostConstruct
public void init() {
users.add("Admin");
users.add("User1");
users.add("User2");
System.out.println("UserService initialized");
}
}
```
## 运行方式
### 方式一:使用 Maven 插件(推荐)
```bash
mvn clean javafx:run
```
### 方式二:命令行运行
```bash
# 编译
mvn clean compile test-compile
# 运行(需要正确配置 JavaFX 模块路径)
java --module-path %PATH_TO_JAVAFX% \
--add-modules javafx.controls,javafx.fxml \
-cp target/classes;target/test-classes;... \
com.imyeyu.inject.javafxdemo.FxMain
```
## 应用功能
1. **用户管理**
- 添加用户
- 删除选中用户
- 显示用户列表
2. **实时日志**
- 操作日志记录
- 时间戳显示
- 清空日志功能
3. **依赖注入演示**
- 控制器通过构造器注入服务
- 服务之间相互依赖
- @Bean 方法提供配置对象
- @Qualifier 精确匹配依赖
## 技术亮点
1. **零配置** - 使用注解驱动,无需 XML
2. **类型安全** - 编译时类型检查
3. **生命周期管理** - @PostConstruct 初始化
4. **优雅集成** - 与 JavaFX 无缝整合
5. **依赖追踪** - 清晰的依赖关系
## 注意事项
1. JavaFX 依赖设置为 `test` scope仅用于演示
2. 控制器工厂必须在加载 FXML 前设置
3. FXML 文件路径相对于 classpath
4. 确保 JDK 21 和 JavaFX 21.0.2 版本匹配