我有一个包含多个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 */
}
}我发现,运行它们中的任何一个都会触发所有它们的run方法!
同样出乎意料的是:我的项目还包含一个用于启动RESTful服务的类。启动服务还会调用每个SpringBootApplication类的每个SpringBootApplication方法。
(请注意,类似的情况反过来发生:当我运行任何命令行实用程序时,还会发现RESTful服务bean并开始运行该服务。这个至少我明白,而且应该预见到!)
这是预期的行为吗?有任何记载吗?如果不控制调用了谁的SpringApplication.run方法,那么类参数对run的用途是什么?
当然,我可以重新构造包和/或组件扫描,这样不同的SpringBootApplication类就不会彼此发现(当它们不应该发现时也不会发现RESTful服务bean),但是我想更好地理解这一点。谢谢!
发布于 2018-11-01 20:17:34
SpringBootApplication注释是什么意思?(重点是我的)
指示一个配置类,该类声明一个或多个@Bean方法,并触发自动配置和组件扫描。这是一个方便的注释,相当于声明@Configuration、@EnableAutoConfiguration和@ComponentScan。
因此,用它注释多个类将因此实例化多个配置/bean实例。
CommandLineRunner接口的作用是什么?(重点是我的)
接口,用于指示当包含在SpringApplication中时,bean应该运行。多个CommandLineRunner bean可以在同一个应用程序上下文中定义,并可以使用有序接口或@Order注释进行排序。
所以真正被注意到的行为是人们所期望的。
无论您以何种方式运行应用程序,所有的SpringBootApplication bean都是实例化的,而且您也不需要显式调用run()来使它们运行。
为了实现您想要的(排除一些bean和包含其他bean),使用Spring概要文件可能是一种方法。
发布于 2018-11-01 20:13:29
SpringApplication.run和CommandLineRunner.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的同一个类中也不需要有主方法。
https://stackoverflow.com/questions/53108567
复制相似问题