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(上)