首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringApplication.run运行所有CommandLineRunner bean

SpringApplication.run运行所有CommandLineRunner bean
EN

Stack Overflow用户
提问于 2018-11-01 20:02:32
回答 2查看 1.2K关注 0票数 1

我有一个包含多个main类的项目。这里有一个(简化):

代码语言:javascript
复制
@SpringBootApplication
public class ModelStaging implements CommandLineRunner
{
    public static void main(String[] args)
    {
        SpringApplication.run(ModelStaging.class, args);
    }

    @Override
    public void run(String... args) throws Exception
    {
        /* lots of code omitted */
    }
}

我发现,运行它们中的任何一个都会触发所有它们的run方法!

同样出乎意料的是:我的项目还包含一个用于启动RESTful服务的类。启动服务还会调用每个SpringBootApplication类的每个SpringBootApplication方法。

(请注意,类似的情况反过来发生:当我运行任何命令行实用程序时,还会发现RESTful服务bean并开始运行该服务。这个至少我明白,而且应该预见到!)

这是预期的行为吗?有任何记载吗?如果不控制调用了谁的SpringApplication.run方法,那么类参数对run的用途是什么?

当然,我可以重新构造包和/或组件扫描,这样不同的SpringBootApplication类就不会彼此发现(当它们不应该发现时也不会发现RESTful服务bean),但是我想更好地理解这一点。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-01 20:17:34

SpringBootApplication注释是什么意思?(重点是我的)

指示一个配置类,该类声明一个或多个@Bean方法,并触发自动配置和组件扫描。这是一个方便的注释,相当于声明@Configuration、@EnableAutoConfiguration和@ComponentScan

因此,用它注释多个类将因此实例化多个配置/bean实例。

CommandLineRunner接口的作用是什么?(重点是我的)

接口,用于指示当包含在SpringApplication中时,bean应该运行。多个CommandLineRunner bean可以在同一个应用程序上下文中定义,并可以使用有序接口或@Order注释进行排序。

所以真正被注意到的行为是人们所期望的。

无论您以何种方式运行应用程序,所有的SpringBootApplication bean都是实例化的,而且您也不需要显式调用run()来使它们运行。

为了实现您想要的(排除一些bean和包含其他bean),使用Spring概要文件可能是一种方法。

票数 1
EN

Stack Overflow用户

发布于 2018-11-01 20:13:29

SpringApplication.runCommandLineRunner.run根本没有任何关系,他们只是碰巧有着相同的名字。https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-command-line-runner的文档提到该接口有多个实现,因此可以从那里推断所有实现都将被执行。

此外,SpringApplication.run(Model.class, args)示例中的类名只告诉Spring,在哪个类中查找@SpringBootApplication注释。

在实现CommandLineRunner的同一个类中也不需要有主方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53108567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档