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:
170
javafx-demo.md
Normal file
170
javafx-demo.md
Normal 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 版本匹配
|
||||
Reference in New Issue
Block a user