通过“Spring boot + JavaFX”合作获得认可。
希望得到此类问题的答案:
- 在网络上的示例中,我只发现了“@SpringBootApplication”设置为“... extends Application”的情况,并由此覆盖了“init()”方法。但是有没有办法将初始注释放在另一个位置并将“Application”bean 标记为组件,从而手动启动它?
我还不太擅长“JavaFX”,我尝试通过调用“Application.start(UIClass.class)”来启动该 bean,但没有得到 spring 功能(我认为这并不不启动对象 bean,而是单独启动它)。
- 如何从“扩展应用程序”正确启动 Spring 应用程序?我发现的示例建议重写“init()”并将“ApplicationContext”放置在那里。这可行,但没有设法使用 Autowiring 和类似的东西(并且我确实验证了绑定(bind)是否有效并具有适当的命名)。
在类似的线程( Spring Boot Main and JavaFX )中,我找到了一个使用以下方法的解决方案:
ApplicationContext ctx = SpringApplication.run(Root.class);
ctx.getAutowireCapableBeanFactory().autowireBean(this);
但我感觉这更像是一种解决方法,而且我在某个地方犯了错误。
提前致谢。
最佳答案
总的来说,我认为如果您从应用程序的另一部分访问 Application
实例,您可能需要重构您的应用程序。 应用程序
的作用只是管理应用程序生命周期,因此从其他地方访问该对象表明您可能在某处违反了设计原则(至少是单一职责)。
也就是说,存在一些极端情况。我有一个应用程序,需要访问 Controller 中的 HostServices
,而这通常只能通过 Application
实例获得。在这种情况下,我使用了与您建议的类似的解决方案/解决方法,以便以编程方式将 HostServices 注册为“Spring 管理的”bean。
这里的底线是您有两个工具包/框架负责在某种程度上创建和管理对象生命周期。 (JavaFX 与其说是一个框架,不如说是一个工具包,并没有做太多的对象生命周期管理,但它做了一些。)任何时候当您处于这种情况并且您希望一个框架了解由该框架创建和管理的对象时,其他框架,您需要在两个框架之间进行一些编程连接。这是一个例子,因为 Application
实例是由 JavaFX 为您创建的,因此如果您希望 Spring 知道它,您必须显式地告诉 Spring。
总而言之,正确构建应用程序将最大限度地减少对您建议的解决方法的需求,但在某些情况下可能有必要这样做。通常没有办法配置一个框架来支持另一个框架创建的对象,除非第一个框架明确支持第二个框架。
关于JavaFX + Spring boot 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909766/