SpringApplication.run 主方法

Posted

技术标签:

【中文标题】SpringApplication.run 主方法【英文标题】:SpringApplication.run main method 【发布时间】:2014-08-07 22:21:43 【问题描述】:

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

它自动创建了一个 Application 类文件,并且该路径与 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 框架。我该怎么做?

【问题讨论】:

你的意思是你想通过 maven 启动这个应用程序而不是从 IDE 启动? 您的 ReconTool 是 Spring 应用程序?或者可能是普通的 Java 应用程序? 【参考方案1】:

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

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)

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

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

【讨论】:

我想你的意思是:SpringApplication.run(ReconTool.class, args); 但你是对的,SpringApplication.run(ReconTool.class, args) 也可以:) 我宁愿离开SpringApplication.run(Application.class,因为这行得通,第二个解决方案对我来说太神奇了:) 您的解决方案在没有 @Component 的情况下也可以工作 :) github.com/mariuszs/spring-run-magic 现在,您可以替换 @Configuration@ComponentScan@EnableAutoConfiguration 并改用 @SpringBootApplication【参考方案2】:

使用:

@ComponentScan
@EnableAutoConfiguration
public class Application 

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

        //do your ReconTool stuff
    

适用于所有情况。无论您是想从 IDE 还是构建工具启动应用程序。

使用 maven 只需使用 mvn spring-boot:run

在 gradle 中它将是 gradle bootRun

在 run 方法下添加代码的另一种方法是拥有一个实现 CommandLineRunner 的 Spring Bean。看起来像:

@Component
public class ReconTool implements CommandLineRunner 

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

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

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

【讨论】:

你偷了我所有的想法 :) 看起来我们在并行思考:)【参考方案3】:

另一种方法是扩展应用程序(因为我的应用程序是继承和自定义父应用程序)。它会自动调用父级及其命令行运行程序。

@SpringBootApplication
public class ChildApplication extends ParentApplication
    public static void main(String[] args) 
        SpringApplication.run(ChildApplication.class, args);
    

【讨论】:

以上是关于SpringApplication.run 主方法的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot:SpringApplication.run的源码解析

SpringBoot:SpringApplication.run的源码解析

SpringBoot:SpringApplication.run的源码解析

Spring boot 源码分析SpringApplication.run(上)

微服务 SpringBoot 2.0:启动剖析之SpringApplication.run

Spring Boot深入原理 - SpringApplication启动原理