如何使用摆动应用程序配置弹簧启动

2022-09-01 21:47:32

我想使用spring-boot-starter-data-jpa功能来创建一个非Web应用程序。在52.4文档中说:

要作为业务逻辑运行的应用程序代码可以作为 CommandLineRunner 实现,并作为@Bean定义放入上下文中。

我的 AppPrincipalFrame 看起来像这样:

@Component
public class AppPrincipalFrame extends JFrame implements CommandLineRunner{

private JPanel contentPane;

@Override
public void run(String... arg0) throws Exception {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                AppPrincipalFrame frame = new AppPrincipalFrame();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

引导应用程序类如下所示:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {  
  public static void main(String[] args) {
   ApplicationContext context = SpringApplication.run(Application.class, args);
   AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class);
  }
}

但不起作用。有人有这方面的样本吗?

已编辑并添加了例外。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException:      Error creating bean with name 'appPrincipalFrame'.

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [es.adama.swing.ui.AppPrincipalFrame]: Constructor threw exception; nested exception is java.awt.HeadlessException 

问候。


答案 1

自从你发布这个问题以来已经有一段时间了,但是我在一个我正在迁移的旧项目中遇到了同样的问题,并想出了一种不同的方法,我认为这更清楚,以使事情发挥作用。

你可以使用:而不是使用:并且没有必要使玩具应用程序类从JFrame扩展。因此,代码可能如下所示:SpringApplication.run(Application.class, args);new SpringApplicationBuilder(Main.class).headless(false).run(args);

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {  
    public static void main(String[] args) {
    ConfigurableApplicationContext context = new SpringApplicationBuilder(Application.class).headless(false).run(args);
    AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class);
}

答案 2

必须将 Swing 应用程序放在 Swing 事件队列中。不这样做是一个严重的错误。

所以正确的方法:

public static void main(String[] args) {

    ConfigurableApplicationContext ctx = new SpringApplicationBuilder(SwingApp.class)
            .headless(false).run(args);

    EventQueue.invokeLater(() -> {
        SwingApp ex = ctx.getBean(SwingApp.class);
        ex.setVisible(true);
    });
}

此外,我们可以只使用注释。@SpringBootApplication

@SpringBootApplication
public class SwingApp extends JFrame {

请参阅我的Spring Boot Swing集成教程,以获取完整的工作示例。


推荐