Files
timi-inject/javafx-demo.md
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

171 lines
3.8 KiB
Markdown
Raw Permalink 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.

# 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 版本匹配