1、spring boot自动配置原理?

1.spring boot自动配置主要是通过主程序类Application的几个核心配置实现自动配置,主要由@SpringBootConfiguration、@ComponentScan()、@EnableAutoConfiguration核心配置组成
@SpringBootConfiguration主要告诉系统这是一个配置类
@ComponentScan()规定了扫描哪些包下的组件,并将组件进行加载
@EnableAutoConfiguration 是实现自动配置的入口,其主要的两个配置@AutoConfigurationPackage利用Register给容器导入一系列的组件,然后通过@Import自动导入所有符合配置条件的Bean对象,加载到IOC容器中。
2.spring boot利用@Improt+@Configuration+Spring spi实现自动配置,自动配置类由各个starter包提供(如web、redis、mybatis),使用@Configuration+Bean定义配置类,放到META-INF/spring.factories下使用spring spi扫描META-INF/spring.factories下的配置类,最后使@Import导入自动配置类。

2、如何理解Spring boot中的starter

举个例子,比如我们要开发一个web应用,如果我们使用spring+spring mvc,需要在xml中定义web开发的相关bean配置。
spring boot引入了starter,starter就是定义一个starter的jar包,写一个关于web开发的@Configuration配置类,将这些bean定义在里面,然后再starter包的META-INF/spring.factories中写入该配置类,spring boot会按照约定来加载该配置类。(starter-web整合了spring组件、web MVC、jackson、logging等依赖项)
开发人员只要将相应的starter包引入到应用中,进行相应的属性配置,就可以直接进行代码的开发了。

3、什么是嵌入式服务器?为什么要使用嵌入式服务器?

之前我们利用spring+spring mvc开发一个web程序,我们需要下载部署tomcat,生成一个war包来运行我们的服务器。
spring boot将服务器(tomcat)嵌入到可部署的服务器JVM中,比如我们生成了一个tomcat.jar包嵌入到我们的虚拟机中,这样我们就可以像运行普通的java程序一样,运行web程序。

4、浅析Spring Boot中web请求映射原理

spring boor请求映射底层原理和spring mvc是相同的,主要是根据DispatcherServlet完成请求映射的功能。

step1:spring boot底层自动配置了DispatcherServlet(扫描spring.factories文件来获取自动配置项的)
step2:核心是在于调用了DispatcherServlet类中的doDispatch()方法进行了请求的分派,这个方法就是请求映射的关键之处。
step3:doDispatch方法首先通过getHandler方法获取到了处理请求的handler;
getHandler方法主要是通过存储再HandlerMapping中的handler选择匹配当前请求的handler.
image.png
所有的请求都存储在RequestMappingHandlerMapping中
image.png
step4:找到能处理Controller.method()对应的适配器HandlerAdapter来处理参数
step5:适配器执行目标方法,通过挨个判断参数解析器确定方法参数的每一个值,并将该解析器存入到缓存中(下次可以直接调用,无需重新遍历)
六、Spring Boot常见面试题 - 图3

5、SpringBootApplication运行流程

主启动类SpringApplication的运行流程:
step1:通告started()方法,收集、保存一些相关参数信息(bootstrapRegistryInitializers初始化引导器、ApplicationContextInitilizaer、ApplicationListener监听器等)
step2:通知EnvironmentPrepare()环境准备方法,创建并准备相关的环境Environment
step3:创建并初始化ApplicationContext,例如设置环境、加载配置等
step4:refresh ApplicationContext,完成最终的程序启动

6、数据响应与内容协商源码分析

1、服务器发送请求
2、拿到返回值及返回值对象的类型,匹配对应的返回值处理器对返回值进行处理。
遍历15个返回值处理器是否支持处理此类型的返回值
六、Spring Boot常见面试题 - 图4
3、找到匹配的返回值处理器后,调用handleReturnValue()方法对返回值进行处理
1)客户端能够接收什么样的类型

  1. - 涉及到内容协商部分(浏览器通过请求头的形式告诉服务器客户端能够接收什么样的内容类型)
  2. - 如何确定客户端能够接收什么样的内容类型:contentNegotiationManager内容协商管理器默认采用基于请求头的策略
  3. - 存在唯一的HeaderContentNegotiationStrategy策略 确定客户端可以接收的内容类型。

2)服务器根据自身的能力,能够生产出什么样的内容
4、一旦服务器能够生产的内容和客户端能够接收什么样的类型相匹配后,Spring MVC会挨个遍历底层所有的MessageConverters消息转换器,看谁能够处理,进行数据的写出?

     - MessageConverter的作用是否支持将此class类型的对象,转为MediaType类型的数据
     - 以响应json数据为例,最终得到MappingJackson2HttpMessageConveter可以将对象写成json
     - 利用MappingJackson2HttpMessageConveter将对象转为json再写出去

7、Spring Boot中Web请求拦截器源码分析

web开发中,我们可以使用实现HandlerInterceptor接口或者继承实现了HandlerInterceptor的类(HandlerInterceptorAdapter)来过滤web请求。
1、根据当前请求,找到HandleExecutionChain(可以处理请求的handler和以及handler的所有拦截器组成的拦截器链)
2、按照顺序执行每个拦截器的preHandler()方法,若当前拦截器返回true,则直接进入下一个拦截器继续执行preHandler()方法
3、若其中有一个拦截器的preHandler()方法返回false,直接跳出不执行目标方法,然后倒序执行所有已经执行过方法的拦截器的afterComplention()方法。
4、执行完所有的preHandler()方法后,开始执行目标方法,执行完目标方法后,开始倒序依次执行postHandler()方法。
5、执行完所有的postHandler后,开始进行页面渲染,页面渲染后开始倒序执行afterComplention()方法

注:正序执行preHandler()方法和倒序执行postHandler()方法期间,任何步骤发生异常都会直接触发afterComplention()方法。