代码之家  ›  专栏  ›  技术社区  ›  Draaksward

JavaFX+Spring引导实现

  •  1
  • Draaksward  · 技术社区  · 6 年前

    获得“Spring boot+JavaFX”合作伙伴的认可。

    希望得到这些问题的答案:

    1. 在整个web的示例中,我只找到了将“@SpringBootApplication”设置为“…extends Application”的情况,并且通过这种方式重写了“init()”方法。但是有没有办法将初始注释放在另一个地方,并将“应用程序”bean标记为组件,从而手动启动它?

    我还不太擅长使用“JavaFX”,我试图通过调用“Application”来启动这个bean。start(UIClass.class)”,没有spring功能(我的想法是,这不会启动对象bean,而是单独启动它)。

    1. 如何正确地从“扩展应用程序”启动spring应用程序?我发现的示例建议重写“init()”并将“ApplicationContext”放在那里。这是可行的,但没有成功地使用自动布线和类似的东西(我确实验证了绑定是否有效,并具有适当的命名)。

    在类似的线程中( Spring Boot Main and JavaFX )我找到了一个解决方案来使用:

    ApplicationContext ctx = SpringApplication.run(Root.class); 
    ctx.getAutowireCapableBeanFactory().autowireBean(this);
    

    但我觉得这更像是一种变通方法,我在某个地方犯了一个错误。

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   James_D    6 年前

    总的来说,如果你访问 Application 实例,您可能需要重构应用程序。的作用 应用 只是为了管理应用程序生命周期,所以从其他地方访问该对象就表明您可能在某个地方违反了设计原则(至少是单一责任)。

    也就是说,有一些角落案例。我有一个应用程序需要访问 HostServices 在控制器中,通常只能通过 应用 例子在这种情况下,为了以编程方式注册 主机服务 作为“Spring管理的”bean。

    这里的底线是,您有两个工具包/框架,它们在某种程度上负责创建和管理对象生命周期。(JavaFX与其说是一个框架,不如说是一个工具包,它并没有做太多的对象生命周期管理,但它做了一些。)在这种情况下,如果希望一个框架知道另一个框架创建和管理的对象,则需要在两个框架之间进行一些编程连接。这是一个例子,因为 应用 实例是由JavaFX为您创建的,所以如果您想让Spring知道它,就必须显式地告诉Spring。

    因此,总之,正确构造应用程序将最大限度地减少对您建议的各种变通方法的需要,但在某些情况下,这可能是必要的。通常无法配置一个框架来支持另一个框架创建的对象,除非第一个框架中明确支持第二个框架。