Eigentlich ist es die N-te Abkochung, aber es ist möglicherweise nicht die beste Vorgehensweise, da es sich um einen Versuch und Irrtum handelte, als es keinen [diesen Artikel] gab (https://qiita.com/shibafu/items/b4c08597df010e95c99a). nicht.
MainApp.java
/**
*Startklasse
* @author ysrken
*/
@ComponentScan
public class MainApp extends Application {
private static ConfigurableApplicationContext context;
/**
*Hauptfunktion
* @param args Befehlszeilenargumente
* @löst eine Ausnahme aus Laufzeitausnahme
*/
public static void main(String[] args) throws Exception {
//Da dieser Kontext in Zukunft wiederverwendet wird, habe ich es gewagt, ihn wie oben beschrieben zu einer statischen Variablen zu machen.
context = new AnnotationConfigApplicationContext(MainApp.class);
launch(args);
}
/**
*JavaFX-Startvorgang
* @param stage Bühneninformationen
* @löst eine Ausnahme aus Laufzeitausnahme
*/
public void start(Stage stage) throws Exception {
//Es wird sicher generiert, aber der Punkt ist, dass es getBean ist
FXMLLoader loader = new FXMLLoader();
loader.setControllerFactory(MainApp.getApplicationContext()::getBean);
Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream("/fxml/MainView.fxml"));
Scene scene = new Scene(rootNode);
stage.setScene(scene);
mainStage.show();
}
/**
*Wird zum Weiterleiten des ApplicationContext verwendet
* @Geben Sie Shared ApplicationContext zurück
*/
public static ApplicationContext getApplicationContext() {
return context;
}
/**
*JavaFX-Terminierungsverarbeitung
* @löst eine Ausnahme aus Laufzeitausnahme
*/
@Override
public void stop() throws Exception {
context.close();
}
}
Der wichtige Teil hier ist der Teil "ConfigurableApplicationContext context", der von "getApplicationContext ()" beim Erstellen anderer Fenster verwendet wird. Mit anderen Worten, wenn Sie "FXMLLoader" verwenden, legen Sie den Kontext als "loader.setControllerFactory (MainApp.getApplicationContext () :: getBean)" fest, anstatt ihn einfach als "neuen FXMLLoader ()" festzulegen. Auf diese Weise erstreckt sich der DI des Spring Frameworks auf den "Controller" und das "Modell" des Fensters.
Controller.java
@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Controller{
/**
* Model
*/
@Autowired
Model model;
/**
*Initialisieren
*/
public void initialize() {
~~~
}
}
Wenn Sie den Kontext wie oben beschrieben einstellen, wird das Modell nur von "@ Autowired" geladen. Wenn Sie mehrere Controller und Modelle erstellen möchten, kommentieren Sie die Spezifikation "SCOPE_PROTOTYPE" aus.
Model.java
@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Model{
/**
*Initialisieren
*/
publicModel() {
~~~
}
}
Ich bin froh, dass @ Autowired
auch in Model funktioniert.
Ich denke, dass die Klasse, die Sie DI möchten, normalerweise "@ Component" usw. hat, aber wenn Sie eine Instanz einer Klasse erstellen, die "@ Autowired" in einer anderen als der obigen Controller-Beziehung verwendet, schreiben Sie wie folgt Lass uns gehen.
sample.java
@Component
public class SampleClass {
/**
* Model
*/
@Autowired
Hoge hoge;
~~~~~~
}
// OK
final SampleClass x = MainApp.getApplicationContext().getBean(SampleClass.class);
// NG
final SampleClass y = new SampleClass();
Recommended Posts