SpringApplication.run main method为什么不呢SpringApplication.run(ReconTool.class, args)

2022-08-31 20:29:35

我使用Spring Starter项目模板在Eclipse中创建了一个项目。

它自动创建了一个应用程序类文件,并且该路径与POM.xml文件中的路径匹配,因此一切都很好。下面是应用程序类:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        //SpringApplication.run(ReconTool.class, args);  
        ReconTool.main(args);
    }
}

这是我正在构建的一个命令行应用程序,为了让它运行,我不得不注释掉SpringApplication.run行,然后从我的另一个类中添加main方法即可运行。除了这个快速的jerry-rig之外,我还可以使用Maven构建它,它作为Spring应用程序运行。

但是,我宁愿不必注释掉该行,而是使用完整的Spring框架。我该怎么做?


答案 1

您需要运行,因为此方法启动整个Spring框架。下面的代码将您与Spring Boot集成在一起。Application.run()main()

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

ReconTool.java

@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        main(args);
    }

    public static void main(String[] args) {
        // Recon Logic
    }
}

为什么不呢SpringApplication.run(ReconTool.class, args)

因为这种方式弹簧没有完全配置(没有组件扫描等)。只创建在 run() 中定义的 bean (ReconTool)。

示例项目:https://github.com/mariuszs/spring-run-magic


答案 2

用:

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);  

        //do your ReconTool stuff
    }
}

将在任何情况下工作。是要从 IDE 还是从生成工具启动应用程序。

使用专家只是使用mvn spring-boot:run

而在gradle中,它将是gradle bootRun

在 run 方法下添加代码的替代方法是使用实现 的 Spring Bean。这看起来像这样:CommandLineRunner

@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
       //implement your business logic here
    }
}

从Spring的官方指南存储库中查看本指南

完整的 Spring Boot 文档可以在这里找到


推荐