Spring boot SpringApplication.run运行所有CommandLineRunner bean

Spring boot SpringApplication.run运行所有CommandLineRunner bean,spring-boot,Spring Boot,我有一个包含多个main类的项目。这里有一个(简化的): 我发现,运行其中任何一个都会触发它们的run方法 同样出乎意料的是:我的项目还包含一个用于启动RESTful服务的类。启动服务还调用每个springbootplication类的每个run方法 (请注意,类似的情况反过来发生:当我运行任何命令行实用程序时,RESTful服务bean也会被发现,服务开始运行。至少我理解并应该看到这一个!) 这是预期的行为吗?它在任何地方都有记录吗?如果不控制调用谁的run方法,那么SpringApplica

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

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

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

(请注意,类似的情况反过来发生:当我运行任何命令行实用程序时,RESTful服务bean也会被发现,服务开始运行。至少我理解并应该看到这一个!)

这是预期的行为吗?它在任何地方都有记录吗?如果不控制调用谁的
run
方法,那么
SpringApplication.run的class参数的用途是什么


当然,我可以重新构造包和/或组件扫描,以便各种
SpringBootApplication
类不会相互发现(也不会在不应该的时候发现RESTful服务bean),但我想更好地理解这一点。谢谢

SpringApplication.run
CommandLineRunner.run
之间没有任何关系,它们只是碰巧有相同的名称。处的文档提到该接口有多个实现,因此可以从中推断,所有实现都将被执行

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


也不要求在实现CommandLineRunner的同一类中有main方法。

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

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

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

CommandLineRunner
界面的作用是什么?(重点是我的)

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

因此,实际注意到的行为是预期的行为。
无论您以何种方式运行应用程序,所有SpringBootApplication bean都是实例化的,而且您不需要显式调用
run()
来运行它们


为了实现您想要的(排除一些bean并包括其他bean),使用Spring引导配置文件可能是一种方法

很好的解释,谢谢。仍然很好奇为什么一个类会被传递给run方法——对于未受过训练的人来说,它看起来就是要运行的类。非常欢迎您。传递该类是因为它是运行Spring引导应用程序的经典方式。所以这是不可避免的。顺便说一句,你关于使用Spring启动配置文件的建议是正确的。我注释了几个类,就这样。更好的是:通过在每个main()方法中选择活动概要文件(通过调用SpringApplication.setAdditionalProfiles),我得到了我最初想要的效果:调用方只执行一个特定的main()类,一切正常。打电话的人根本不需要知道个人资料。另一个答案是第一个,涵盖了更多的领域,但我很感激有第二个不同的解释。谢谢
@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 */
    }
}