这里我找了一些个人感觉容易问到的面试题
Spring Boot是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能。
通过 Spring Boot ,我们开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。
-
启动类里面调用SpringApplication.run方法
-
在run方法中,首先构造SpringApplication对象,然后再调用run方法
-
在构造SpringApplication对象中,做了如下工作
- 将sources放入primarySources变量中
- 判断webApplication是什么类型的
- 设置ApplicationContextInitializer,ApplicationListener,通过加载META-INF/spring.factories中配置的类
- 找到main方法找到启动主类
-
run方法中,做的工作
-
StopWatch主要是监控启动过程,统计启动时间,检测应用是否已经启动或者停止。
-
加载SpringApplicationRunListener(也是通过META-INF/spring.factories),默认加载的是EventPublishingRunListener
-
调用RunListener.starting()方法。
-
根据args创建应用参数解析器ApplicationArguments;
-
准备环境变量:获取环境变量environment,将应用参数放入到环境变量持有对象中,监听器监听环境变量对象的变化(listener.environmentPrepared)
-
打印Banner信息(SpringBootBanner)
-
创建SpringBoot的应用上下文(AnnotationConfigEmbeddedWebApplicationContext)
-
prepareContext上下文之前的准备
-
refreshContext刷新上下文
-
afterRefresh(ApplicationRunner,CommandLineRunner接口实现类的启动)
-
返回上下文对象
-
在web项目中,会在Maven中配置 spring-boot-starter-web 包,该包中包含了spring-core、spring-content、servlet、tomcat、jackson、HikariCP、junit、jdbc、slf4j 等
-
【推荐】
spring-boot-devtools
插件。注意,这个工具需要配置 IDEA 的自动编译。 -
Spring Loaded 插件。
Spring Boot 2.X 后,官方宣布不再支持 Spring Loaded 插件 的更新,所以基本可以无视它了。
-
JRebel 插件,需要付费。
-
使用插件化开发,插件化代码使用手动注册Bean的方式
关于如何使用 spring-boot-devtools
和 Spring Loaded 插件,可以看看 《Spring Boot 学习笔记:Spring Boot Developer Tools 与热部署》 。
- Spring Boot 在启动时扫描项目所依赖的 jar 包,寻找包含
spring.factories
文件的 jar 包。 - 根据
spring.factories
配置加载 AutoConfigure 类。 - 根据
@Conditional
等条件注解的条件,进行自动配置并将 Bean 注入 Spring IoC 中。