了解一下springboot的主函数, 其中代码如下:
@SpringBootApplication
public class SpdevtoolsApplication {
public static void main(String[] args) {
SpringApplication.run(SpdevtoolsApplication.class, args);
}
}
springboot中的主函数, 作为程序的入口点, 如果是web程序, 会开启一个server
一个项目中, 应该有一个main函数, 而不是多个, 如果是多个需要进行额外的配置, 否则可能运行出错
main函数, 点开这个run方法, 源代码如下
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
我们不难发现, 它实际上它是创建了一个对象数组, 它再次调用的run方法为
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return (new SpringApplication(primarySources)).run(args);
}
到这里, 我们看到它再次调用了run方法, 这次仍然很复杂, 但至少能看到是实例化了springapplication这个类, 由于代码较长, 需要自行查阅
这个springapplication主要干了以下几件事
- 推断应用是普通项目还是web项目, 以确定要开启的是什么服务
- 扫描并自动加载所有可用初始化器, 设置到initializers属性中
- 找出所有的应用程序监听器, 设置到listeners属性中
- 推断并设置main方法的定义类, 找到运行的主类
结论是 : 传入的class必须是被自动配置的, 也就是@EnableAutoConfiguration, 也可以是包含了@EnableAutoConfiguration的组合注解, 启动后和main方法同级的类, 包均能被自动加载