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

3.8 KiB
Raw Blame History

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

应用功能

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