文章目录
- 1、SpringMVC的执行流程
-
- [1.1 视图阶段](#1.1 视图阶段)
- [1.2 前后端分离阶段](#1.2 前后端分离阶段)
- 2、SpringBoot自动配置原理
- 3、框架常用的注解
-
- [3.1 Spring的注解](#3.1 Spring的注解)
- [3.2 SpringMvc的注解](#3.2 SpringMvc的注解)
- [3.3 SpringBoot的注解](#3.3 SpringBoot的注解)
- 4、面试
1、SpringMVC的执行流程
1.1 视图阶段
旧项目中,未前后端分离时,用到JSP,相关流程为:
- 浏览器发出请求
java
http://localhost:8080/user/getById/1
- 请求达到前端控制器DispatcherServlet,它相当于一个调度中心,会加载处理器映射器、处理器适配器、视图解析器。DispatcherServlet被Tomcat容器初始化,所有的请求先经过它。
- DispatcherServlet向处理器映射器去查询handler,即查询这个接口该调哪个Controller的哪个方法。处理器映射器里以key-value形式存了接口路径合类名+方法名

- 查询到handler后,映射器返回给控制器一个处理器执行链HandlerExecutionChain,注意不仅仅是返回一个接口对应的类名 + 方法名,如果接口涉及拦截器,拦截器也会被封装到处理器执行链对象中

- 控制器通过适配器HandlerAdaptor,调用handler并执行,且这里适配器还负责处理了参数绑定和返回值处理。最终返回一个ModelAndView给前端控制器

- 前端控制器请求视图解析器ViewResolver,最终得到一个View对象(逻辑视图转为真正的视图)

- 前端控制器渲染视图,返回给浏览器一个有数据的页面

流程总结:

1.2 前后端分离阶段
不再返回一个ModelAndView,而是返回一个Json给前端(将最终结果通过HttpMessageConvert转换器转为Json):

流程总结:

2、SpringBoot自动配置原理
从SpringBoot启动类的注解可以看到,其源码有三个注解:

- @SpringBootConfguration:与 @Configuration 注解作用相同,用来声明当前也是一个配置类
- @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包
- @EnableAutoConfiquration
@EnableAutoConfiquration则是SpringBoot 实现自动化配置的核心注解,继续往下跟:

@Import注解,导入一个Bean到Spring容器。这里导入一个Selector,用来加载类路径下的spring.factories中定义的自动配置类,并将这些自动加载为配置Bean

spring.factories中已经定义好了很多自动配置类,大概有一百多个,但这一百多个不是都要加载到IoC容器中。以spring.factories中的RedisAutoConfiguration这个自动配置类为例,这里有两个关键注解,一个是@ConditionalOnClass,即有RedisOperation类的字节码时,创建这个RedisAutoConfig自动配置类的Bean,如此,只有你引入了Redis-starter时,就会加载RedisAutoConfig这个Bean。 此外,下面用@Bean创建RedisTemplate这个客户端操作类Bean的条件是,环境中没有叫redisTemplate的Bean,即开发者没有自己定义这个Bean时,框架给你创建并维护个redisTemplate的Bean

总结:

3、框架常用的注解
3.1 Spring的注解
Spring框架(亮点:IoC、Bean)的注解:
3.2 SpringMvc的注解
SpringMvc框架(亮点:web请求处理)的注解:

3.3 SpringBoot的注解
SpringBoot框架(亮点:快速起步、自动配置)的注解:

再加一个@SpringBootApplication
4、面试