- 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>
3.8 KiB
3.8 KiB
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 容器初始化
@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. 控制器工厂集成
@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. 构造器依赖注入
@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 工厂方法
@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 限定注入
@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 生命周期
@Service
public class UserService {
@PostConstruct
public void init() {
users.add("Admin");
users.add("User1");
users.add("User2");
System.out.println("UserService initialized");
}
}
运行方式
方式一:使用 Maven 插件(推荐)
mvn clean javafx:run
方式二:命令行运行
# 编译
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
应用功能
-
用户管理
- 添加用户
- 删除选中用户
- 显示用户列表
-
实时日志
- 操作日志记录
- 时间戳显示
- 清空日志功能
-
依赖注入演示
- 控制器通过构造器注入服务
- 服务之间相互依赖
- @Bean 方法提供配置对象
- @Qualifier 精确匹配依赖
技术亮点
- 零配置 - 使用注解驱动,无需 XML
- 类型安全 - 编译时类型检查
- 生命周期管理 - @PostConstruct 初始化
- 优雅集成 - 与 JavaFX 无缝整合
- 依赖追踪 - 清晰的依赖关系
注意事项
- JavaFX 依赖设置为
testscope,仅用于演示 - 控制器工厂必须在加载 FXML 前设置
- FXML 文件路径相对于 classpath
- 确保 JDK 21 和 JavaFX 21.0.2 版本匹配