当前位置: 首页 > 知识库问答 >
问题:

使用JavaFX的Spring数据jpa

张亦
2023-03-14

我在OpenJFX中使用Spring JPA。这个项目是JavaFX weaver,只需在pom中添加spring启动数据jpa。

然而,我的Spring JPA的开始时间是15-20秒,在Spring初始化之前,UI不会显示。当用户启动应用程序时,每次都要花很多时间!

作为一种解决方法,我尝试创建一个没有Spring的简单java fx应用程序(在这里使用这个演示),然后从main方法开始,通过按钮从Spring开始使用main方法(参见下面的示例)。这将从spring开始,但依赖项和属性并未过时。

你知道练习那个案子的好方法吗?欢迎任何帮助。

非常感谢。

public class AppBootstrap extends Application {

    @Override
    public void start(Stage primaryStage) {

        Button btn = new Button();

        // start spring jpa main method
        btn.setOnAction(event -> App.main(new String[]{""})); 

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        Application.launch(SpringbootJavaFxApplication.class, args);
    }
}

共有1个答案

蒲寂离
2023-03-14

启动JPA驱动的应用程序会增加ApplicationContext的加载时间。而您可以通过不检查或创建数据库方案(例如设置hibernate)来加快速度。hbm2ddl。auto=none,这不是最好的选择。

根据设计,主阶段显示在加载ApplicationContext之后,因为它应该能够被注入依赖项。

我推荐的最佳实践是在加载ApplicationContext时使用启动屏幕。这有点棘手,因为您有单独的线程,但大致如下所示:

创建一个飞溅窗口

public class Splash {

    private static final int SPLASH_WIDTH = 200;
    private static final int SPLASH_HEIGHT = 200;

    private final Parent parent;
    private final Stage stage; 

    public Splash() {
        this.stage = new Stage();
        stage.setWidth(SPLASH_WIDTH);
        stage.setHeight(SPLASH_HEIGHT);
        Label progressText = new Label("Application loading ...");
        VBox splashLayout = new VBox();
        splashLayout.setAlignment(Pos.CENTER);
        splashLayout.getChildren().addAll(progressText);
        progressText.setAlignment(Pos.CENTER);
        splashLayout.setStyle(
                "-fx-padding: 5; " +
                        "-fx-background-color: white; " +
                        "-fx-border-width:5; " +
                        "-fx-border-color: white;"
        );
        splashLayout.setEffect(new DropShadow());
        this.parent = splashLayout;
    }

    public void show() {
        Scene splashScene = new Scene(parent);
        stage.initStyle(StageStyle.UNDECORATED);
        final Rectangle2D bounds = Screen.getPrimary().getBounds();
        stage.setScene(splashScene);
        stage.setX(bounds.getMinX() + bounds.getWidth() / 2 - SPLASH_WIDTH / 2.0);
        stage.setY(bounds.getMinY() + bounds.getHeight() / 2 - SPLASH_HEIGHT / 2.0);
        stage.show();
    }

    public void hide() {
        stage.toFront();
        FadeTransition fadeSplash = new FadeTransition(Duration.seconds(0.3), parent);
        fadeSplash.setFromValue(1.0);
        fadeSplash.setToValue(0.0);
        fadeSplash.setOnFinished(actionEvent -> stage.hide());
        fadeSplash.play();
    }
}

初始化应用程序

public class SpringbootJavaFxApplication extends Application {

    private ConfigurableApplicationContext context;

    class ApplicationContextLoader extends Task<Void> {

        private final Stage primaryStage;

        ApplicationContextLoader(Stage primaryStage) {
            this.primaryStage = primaryStage;
        }

        @Override
        protected Void call() {
            ApplicationContextInitializer<GenericApplicationContext> initializer =
                    context -> {
                        context.registerBean(Application.class, () -> SpringbootJavaFxApplication.this);
                        context.registerBean(Stage.class, () -> primaryStage);
                        context.registerBean(Parameters.class,
                                SpringbootJavaFxApplication.this::getParameters); // for demonstration, not really needed
                    };
            SpringbootJavaFxApplication.this.context = new SpringApplicationBuilder()
                    .sources(JavaFxSpringbootDemo.class)
                    .initializers(initializer)
                    .run(getParameters().getRaw().toArray(new String[0]));

            return null;
        }
    }

    @Override
    public void start(Stage primaryStage) {
        var splash = new Splash();
        splash.show();
        final ApplicationContextLoader applicationContextLoader = new ApplicationContextLoader(primaryStage);
        applicationContextLoader.stateProperty().addListener((observableValue, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                context.publishEvent(new StageReadyEvent(primaryStage));
                splash.hide();
            }
        });
        new Thread(applicationContextLoader).start();
    }

    @Override
    public void stop() {
        this.context.close();
        Platform.exit();
    }
}
 类似资料:
  • 我正在寻找一个选项来执行Redis BITOP使用Spring redistemplate。我试着在网上搜索一个例子,但找不到任何类似的东西。我能够从JedisStringCommands类获得bitOp函数,但不确定如何使用它。

  • 我有以下实体: 用户: 新闻来源: UsersRepository和NewsSourcesRepository是来自Spring数据JPA的简单JPA存储。其配置如下: 我的测试在第15行抛出一个LazyInitializationException异常。信息是: 未能延迟初始化角色:新闻的集合。实体。用户。使用者新闻源,无法初始化代理-无会话 如果我将我的测试注释为@Transactional

  • 我正在配置elasticsearch spring应用程序,并遵循我创建的RestHighLevelClient文档: 现在我希望我所有的文档都有snake_case的命名策略,在文档上这是我发现的: 在没有进一步配置的情况下,Spring Data Elasticsearch将使用对象的属性名称作为Elasticsearch中的字段名称。这可以通过使用该属性上的@Field注释来更改单个字段。

  • (授权已经在存储库中使用完成)

  • 我很难用ObservableList中获得的数据填充JavaFX中的表视图。 当在病人信息控制器中按下btn确认()时,它会使用病人信息控制器视图中的屏幕文本数据创建一个病人对象。 然后将该对象添加到队列类中的LinkedList队列中。然后返回队列并将其传递给QueueTabPageController方法displayQueue() 我知道,当我将增强的for循环打印到控制台时,患者对象获得了

  • 我正在为一个游戏开发Javafx应用程序。我有一些数据存储在枚举中,但似乎不知道如何轻松地将数据添加到JavaFX TableView,有人能帮我一下吗。我将使用fxml为TableView设置样式。 我希望每一个枚举vallue都在一个单独的行中,在我希望的列中: 图标为图像。 按整数排序。 级别为整数。 经验值为整数。 枚举: