- 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>
171 lines
3.8 KiB
Markdown
171 lines
3.8 KiB
Markdown
# 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 版本匹配
|