当前位置: 首页 > news >正文

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录

  • 1、SpringMVC的执行流程
    • 1.1 视图阶段
    • 1.2 前后端分离阶段
  • 2、SpringBoot自动配置原理
  • 3、框架常用的注解
    • 3.1 Spring的注解
    • 3.2 SpringMvc的注解
    • 3.3 SpringBoot的注解
  • 4、面试

1、SpringMVC的执行流程

1.1 视图阶段

旧项目中,未前后端分离时,用到JSP,相关流程为:

  • 浏览器发出请求
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、面试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • docker 启动关闭,设置仓库地址
  • USB - ACK、NAK和STALL的含义
  • Android ANR Trace日志阅读分析技巧
  • STM32-14-FSMC_LCD
  • 2024年5月架构试题
  • 【C++ ——— 继承】
  • 关于MES管理系统七个维度的核心价值
  • 【python】OpenCV—Bitplane
  • 【自然语言处理】Transformer中的一种线性特征
  • 异常处理实践
  • DBus 在Qt和C++中的使用Demo
  • [Cesium学习]
  • react高阶组件——withRouter
  • FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
  • chatgpt之api的调用问题
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 08.Android之View事件问题
  • 10个最佳ES6特性 ES7与ES8的特性
  • 345-反转字符串中的元音字母
  • angular学习第一篇-----环境搭建
  • Bootstrap JS插件Alert源码分析
  • ECMAScript6(0):ES6简明参考手册
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript类型识别
  • leetcode386. Lexicographical Numbers
  • python学习笔记 - ThreadLocal
  • STAR法则
  • Terraform入门 - 1. 安装Terraform
  • V4L2视频输入框架概述
  • Webpack 4 学习01(基础配置)
  • 阿里云购买磁盘后挂载
  • 从零开始学习部署
  • 搭建gitbook 和 访问权限认证
  • 解析带emoji和链接的聊天系统消息
  • 利用DataURL技术在网页上显示图片
  • 使用parted解决大于2T的磁盘分区
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 移动端 h5开发相关内容总结(三)
  • 优秀架构师必须掌握的架构思维
  • 国内开源镜像站点
  • 交换综合实验一
  • 组复制官方翻译九、Group Replication Technical Details
  • #define用法
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#3.3_存储_Memory
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2)leetcode 234.回文链表 141.环形链表
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (二)WCF的Binding模型
  • (二十三)Flask之高频面试点
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648