通过“Spring boot + JavaFX”合作获得认可。
希望得到此类问题的答案:
我对“JavaFX”还不太擅长,我尝试通过调用“Application.start(UIClass.class)”来启动该 bean,但没有得到 spring 功能(我认为这并不启动对象 bean,但单独启动)。
在类似的线程(Spring Boot Main 和 JavaFX)中,我找到了使用以下方法的解决方案:
ApplicationContext ctx = SpringApplication.run(Root.class);
ctx.getAutowireCapableBeanFactory().autowireBean(this);
但我感觉这更像是一种解决方法,我在某个地方犯了错误。
提前致谢。
总的来说,我认为如果您从应用程序的另一部分访问
Application
实例,您可能需要重构您的应用程序。 Application
的作用只是管理应用程序生命周期,因此从其他地方访问该对象表明您可能在某处违反了设计原则(至少是单一责任)。
也就是说,存在一些极端情况。我有一个应用程序,我需要访问控制器中的
HostServices
,而这通常只能通过 Application
实例获得。在这种情况下,我使用了与您建议的类似的解决方案/解决方法,以便以编程方式将 HostServices
注册为“Spring 管理的”bean。
这里的底线是您有两个工具包/框架负责在某种程度上创建和管理对象生命周期。 (JavaFX 与其说是一个框架,不如说是一个工具包,并没有做太多的对象生命周期管理,但它做了一些。)任何时候当您处于这种情况并且您希望一个框架了解由该框架创建和管理的对象时,其他框架,您需要在两个框架之间进行一些编程连接。这是一个例子,因为
Application
实例是由 JavaFX 为您创建的,所以如果您希望 Spring 知道它,您必须明确地告诉 Spring。
总而言之,正确构建应用程序将最大限度地减少对您建议的解决方法的需求,但在某些情况下可能有必要。通常没有办法配置一个框架来支持另一个框架创建的对象,除非第一个框架明确支持第二个框架。
补充:这里有两个现成的模板,包含 JavaFX、Spring Boot 和 Maven/Gradle。
我将感谢 GitHub 上的明星支持它的免费开源,从而帮助您解决问题。 <3
https://github.com/davidweber411/javafx-JavaFxSpringBootGradleApp
https://github.com/davidweber411/javafx-JavaFxSpringBootMavenApp