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 */
}
}