最初に、アプリケーション構成をApplication
サブクラスから分離します。 JavaFXはアプリケーションサブクラスのインスタンスを作成します。そのクラスのインスタンスは1つだけです。 Springはすべての設定クラスのインスタンスを作成します。したがって、アクセス権がなくても、意図した用途ではないApplicationクラスの複数のインスタンスになります。
あなたが探している分離については、ApplicationContext
との作成と対話をUIの構築と構成から分離して、アプリケーションのビジネス層と対話させることですしかし、私はあなたがそうするべきである方法からこれを後ろ向きに見ていると思います。 Application
クラス、特にstart()
メソッドは、JavaFXアプリケーションのエントリポイントです。 FXフレームワークは起動時にいくつかのハウスキーピング(FXツールキットの起動など)を行い、そのクラスのインスタンスを作成し、startメソッドを呼び出します。これがアプリケーションの基本アセンブリを行う場所なので、ApplicationContext
を作成し、そこから1つまたは2つのBeanを取得するのは自然で正確な場所です。これをUIの作成とコンフィグレーションと区別したい場合は、別の場所に移動する必要があるUIの作成とコンフィグレーションです。 Application
クラスの唯一の責任は、アプリケーションを起動することです。この方法では、そのクラスに注入する状態はまったくありません。このアプローチを使用
は、最小限の春パワードFXアプリケーションは、次のようになります。
をAppConfig.java:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class AppConfig {
@Bean
public Service service() {
return new Service();
}
@Bean
@Scope("prototype")
public Gui gui() {
return new Gui();
}
}
Service.java:
public class Service {
public String confirmationMessage() {
return "You have been confirmed";
}
}
Gui.java(ノートこれは現在サブクラスApplication
ではありませんが、ほぼすべてのGUI作業を行います)。
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
public class Gui {
@Inject
private Service service ;
private VBox view ;
private Label label ;
public Gui() {
Button button = new Button("Press for confirmation");
label = new Label();
label.setVisible(false);
button.setOnAction(e -> label.setVisible(true));
view = new VBox(5, label, button);
view.setPadding(new Insets(20));
view.setAlignment(Pos.CENTER);
}
@PostConstruct
private void init() {
label.setText(service.confirmationMessage());
}
public Parent getView() {
return view ;
}
}
最後に、Application
クラス、Main.java。これは実際にGUIの仕事をしません。アプリケーションのライフサイクルを管理するだけです。ApplicationContext
を作成し、メインビューを表すBeanを取得し、それをプライマリステージに表示します。すべての実際のGUI作業は、MainView
クラスに委譲され、そのインスタンスはSpringによって管理されます。それはプレゼンテーション層のための完全なMVC/MVPのデザインを使用するように
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
private AbstractApplicationContext context ;
@Override
public void start(Stage primaryStage) {
context = new AnnotationConfigApplicationContext(AppConfig.class);
Parent mainView = context.getBean(Gui.class).getView();
primaryStage.setScene(new Scene(mainView));
primaryStage.show();
}
@Override
public void stop() {
context.close();
}
public static void main(String[] args) {
launch(args);
}
}
あなたがしたい場合など
おかげで、FXMLを使用して、このアプローチを拡張することができます!私はこれがクラスの責任を分かち合う良い方法だと思います。 – Basti