为何SpringApplication.run()方法要写在它所启动的类内部?
其实这不是强制要求,但这是SpringBoot约定俗成的最佳实践,背后有几个实际原因:
Java程序的入口规则限制
Java程序的执行入口必须是public static void main(String[] args)方法,这个方法必须归属某个类。SpringBoot本质是Java程序,自然要遵守这个基础规则。把main方法放在带@SpringBootApplication的类里,相当于把「程序入口」和「核心配置类」合并,不用额外创建单独的入口类,简化项目结构。与@SpringBootApplication注解的功能关联
@SpringBootApplication是个组合注解,包含了@Configuration(标记为配置类)、@ComponentScan(自动扫描组件)和@EnableAutoConfiguration(开启自动配置)。当调用SpringApplication.run(ConsumingRestApplication.class, args)时,Spring会把这个类作为配置起点:@ComponentScan默认会扫描该类所在包及其所有子包,自动注册Controller、Service等组件,无需额外配置扫描路径。- 这个类本身也可作为配置类,你能直接在里面写
@Bean方法定义Bean,不用再单独编写配置类。
契合SpringBoot「约定大于配置」的核心思想
SpringBoot的设计初衷就是减少繁琐配置,统一的项目结构能让开发者快速上手,团队协作时也不用纠结入口位置、配置类存放路径。大家都遵循这个写法,项目结构一目了然,降低沟通和维护成本。
当然你也可以把main方法放在其他类里,只要调用SpringApplication.run()时传入正确的配置类(带@SpringBootApplication或相关注解的类)即可,但这样反而会增加不必要的类,违背SpringBoot简化配置的初衷。示例里的写法是最简洁、最贴合SpringBoot设计思想的方式。
内容的提问来源于stack exchange,提问作者Gass

