金三银四面试题之SpringBoot篇
1. 什么是SpringBoot?
- 能够帮助开发者快速整合第三方框架(Spring、Mybatis、hibernate),原理:Maven依赖封装整合和自定义starter;
- 完全去除XML配置,采用注解形式(自动配置),原理:SpringBoot根据Spring体系原生的注解实现包装;
- 不需要外部容器,内嵌服务器(Tomcat),原理:Java语言创建Tomcat服务器,然后将本地class文件交给Tomcat加载。
2. SpringBoot自动配置的原理是什么?
在Spring程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.gfactories文件,该文件中配置了所有需要被创建的Spring容器中的bean。(SPI机制)
3. SpringBoot的核心注解是哪些?他主要由哪几个注解组成?
启动类上面的注解是@SpringBootApplication,它是SpringBoot的核心注解,主要组合包含了以下3个注解:
- @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能;
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项;
- @ComponentScan:Spring组件扫描。
4. 谈谈SpringBoot的启动流程?
核心分为两个步骤:
- 创建SpringApplication对象;
- 调用run()方法实现启动同时返回当前的容器上下文;
具体流程:
- 创建SpringApplication对象,初始化SpringBoot容器;
- 获取当前应用启动类型,原理:判断当前classpath是否有加载servlet类,如果有,则返回servlet web启动方式。webApplicationType分为三种类型:响应式启动(Spring5新特性)、None不会嵌入web容器启动 (将SpringBoot项目放入外部服务器运行)、SERVLET 基于Web容器启动;
- setInitializers():读取SpringBoot包下面的META-INF/spring.factories并获取到对应的ApplicationContextInitializer装配到集合中;
- setListeners():读取SpringBoot包下面的META-INF/spring.factories并获取到对应ApplicationListener装配到集合中;
- mainApplicationClass():获取当前运行的主函数;
- 调用run()方法实现启动;
- StopWatch stopWatch = new StopWatch(); 记录SpringBoot项目启动时间;
- getRunListeners(args); 读取SpringBoot包下面的META-INF/spring.factories并获取到对应SpringApplicationRunListeners装配到集合中;
- listeners.starting(); 循环调用监听starting方法;
- listeners.environmentPrepared(environment);读取配置文件到SpringBoot容器中
- Banner printedBanner = printBanner(environment); 打印SpringBoot Banner;
- 创建SpringBoot上下文AnnotationConfigServletWebServerApplicationContext对象;
- refreshContext(context); 刷新上下文;
- 创建tomcat容器;
- 加载SpringMVC;
- afterRefresh():定义一个空的模版给其他子类实现重写;
- listeners.started(context);使用广播和回调机制通知监听器SpringBoot容器启动成功;
- listeners.running(context); 使用广播和回调机制通知监听器SpringBoot容器正在运行;
- 最后,返回当前上下文