【Java开发】Java面试七大专题第8篇:5. Spring MVC 执行流程,6. Spring 注解【附代码文档】

🏆🏆🏆教程全知识点简介:基础篇 1. 二分查找 2. 冒泡排序 7. ArrayList 8. Iterator 9. LinkedList 10. HashMap 1)基本数据结构 2)树化与退化 3)索引计算 4)put 与扩容 5)并发问题 11. 单例模式 并发篇 1. 线程状态 3. wait vs sleep 4. lock vs synchronized 虚拟机篇 1. JVM 内存结构 4. 内存溢出 5. 类加载 6. 四种引用 7. finalize 框架篇 1. Spring refresh 流程 2. Spring bean 生命周期 6. Spring 注解 7. SpringBoot 自动配置原理 数据库篇 1. 隔离级别 2. 快照读与当前读 3. InnoDB vs MyISAM 4. 索引 索引基础 5. 查询语句执行流程 6. undo log 与 redo log 7. 锁 缓存篇 1. Redis 数据类型 2. keys 命令问题 3. 过期 key 的删除策略 5. 缓存问题 6. 缓存原子性 7. LRU Cache 实现 分布式篇 1. CAP 定理 2. Paxos 算法 4. Gossip 协议 5. 分布式通用设计 6. 一致性 Hash(补充)

📚📚仓库code.zip 👉直接-->: https://gitee.com/xiaoshuai112/Backend/blob/master/Java/Java面试七大专题/note.md 🍅🍅
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节
🚀🚀🚀本篇主要内容
5. Spring MVC 执行流程
要求
- 掌握 Spring MVC 的执行流程
- 了解 Spring MVC 的重要组件的作用
概要
我把整个流程分成三个阶段
- 准备阶段
- 匹配阶段
- 执行阶段
准备阶段
-
在 Web 容器第一次用到 DispatcherServlet 的时候,会创建其对象并执行 init 方法
-
init 方法内会创建 Spring Web 容器,并调用容器 refresh 方法
-
refresh 过程中会创建并初始化 SpringMVC 中的重要组件, 例如 MultipartResolver,HandlerMapping,HandlerAdapter,HandlerExceptionResolver、ViewResolver 等
-
容器初始化后,会将上一步初始化好的重要组件,赋值给 DispatcherServlet 的成员变量,留待后用
匹配阶段
-
用户发送的请求统一到达前端控制器 DispatcherServlet
-
DispatcherServlet 遍历所有 HandlerMapping ,找到与路径匹配的处理器
① HandlerMapping 有多个,每个 HandlerMapping 会返回不同的处理器对象,谁先匹配,返回谁的处理器。其中能识别 @RequestMapping 的优先级最高
② 对应 @RequestMapping 的处理器是 HandlerMethod,它包含了控制器对象和控制器方法信息
③ 其中路径与处理器的映射关系在 HandlerMapping 初始化时就会建立好
- 将 HandlerMethod 连同匹配到的拦截器,生成调用链对象 HandlerExecutionChain 返回
- 遍历HandlerAdapter 处理器适配器,找到能处理 HandlerMethod 的适配器对象,开始调用
调用阶段
- 执行拦截器 preHandle
- 由 HandlerAdapter 调用 HandlerMethod
① 调用前处理不同类型的参数
② 调用后处理不同类型的返回值
- 第 2 步没有异常
① 返回 ModelAndView
② 执行拦截器 postHandle 方法
③ 解析视图,得到 View 对象,进行视图渲染
- 第 2 步有异常,进入 HandlerExceptionResolver 异常处理流程
-
最后都会执行拦截器的 afterCompletion 方法
-
如果控制器方法标注了 @ResponseBody 注解,则在第 2 步,就会生成 json 结果,并标记 ModelAndView 已处理,这样就不会执行第 3 步的视图渲染
6. Spring 注解
要求
- 掌握 Spring 常见注解
提示
- 注解的详细列表请参考:面试题-spring-注解.xmind
- 下面列出了视频中重点提及的注解,考虑到大部分注解同学们已经比较熟悉了,仅对个别的作简要说明
事务注解
- @EnableTransactionManagement,会额外加载 4 个 bean
- BeanFactoryTransactionAttributeSourceAdvisor 事务切面类
- TransactionAttributeSource 用来解析事务属性
- TransactionInterceptor 事务拦截器
- TransactionalEventListenerFactory 事务监听器工厂
- @Transactional
[Spock 框架]
核心
- @Order
切面
- @EnableAspectJAutoProxy
- 会加载 AnnotationAwareAspectJAutoProxyCreator,它是一个 bean 后处理器,用来创建
- 如果没有配置 @EnableAspectJAutoProxy,又需要用到(如事务)则会使用 InfrastructureAdvisorAutoProxyCreator 这个 bean 后处理器
组件扫描与配置类
-
@Component
-
@Controller
-
@Service
-
@Repository
-
@ComponentScan
-
@Conditional
-
@Configuration
-
配置类其实相当于一个工厂, 标注 @Bean 注解的方法相当于工厂方法
[Mockito 文档]
- @Bean 不支持方法重载, 如果有多个重载方法, 仅有一个能入选为工厂方法
- @Configuration 默认会为标注的类生成, 其目的是保证 @Bean 方法相互调用时, 仍然能保证其单例特性
[MapStruct 文档]
- @Configuration 中如果含有 BeanFactory 后处理器, 则实例工厂方法会导致 MyConfig 提前创建, 造成其依赖注入失败,解决方法是改用静态工厂方法或直接为 @Bean 的方法参数依赖注入, 针对 Mapper 扫描可以改用注解方式
[Eclipse Jetty 文档]
-
@Bean
-
@Import
-
四种用法
① 引入单个 bean
② 引入一个配置类
③ 通过 Selector 引入多个类
④ 通过 beanDefinition 注册器
-
解析规则
- 同一配置类中, @Import 先解析 @Bean 后解析
[SBT 文档]
* 同名定义, 默认后面解析的会覆盖前面解析的
* 不允许覆盖的情况下, 如何能够让 MyConfig(主配置类) 的配置优先? (虽然覆盖方式能解决)
* 采用 DeferredImportSelector,因为它最后工作, 可以简单认为先解析 @Bean, 再 Import
-
@Lazy
-
加在类上,表示此类延迟实例化、初始化
-
加在方法参数上,此参数会以方式注入
-
@PropertySource
依赖注入
- @Autowired
- @Qualifier
- @Value
mvc mapping
- @RequestMapping,可以派生多个注解如 @GetMapping 等
mvc rest
- @RequestBody
- @ResponseBody,组合 @Controller => @RestController
- @ResponseStatus
mvc 统一处理
- @ControllerAdvice,组合 @ResponseBody => @RestControllerAdvice
- @ExceptionHandler
mvc 参数
- @PathVariable
mvc ajax
- @CrossOrigin
boot auto
- @SpringBootApplication
- @EnableAutoConfiguration
- @SpringBootConfiguration
boot condition
- @ConditionalOnClass,classpath 下存在某个 class 时,条件才成立
- @ConditionalOnMissingBean,beanFactory 内不存在某个 bean 时,条件才成立
- @ConditionalOnProperty,配置文件中存在某个 property(键、值)时,条件才成立
boot properties
- @ConfigurationProperties,会将当前 bean 的属性与配置文件中的键值进行绑定
- @EnableConfigurationProperties,会添加两个较为重要的 bean
- ConfigurationPropertiesBindingPostProcessor,bean 后处理器,在 bean 初始化前调用下面的 binder
- ConfigurationPropertiesBinder,真正执行绑定操作
7. SpringBoot 自动配置原理
要求
- 掌握 SpringBoot 自动配置原理
自动配置原理
@SpringBootConfiguration 是一个组合注解,由 @ComponentScan、@EnableAutoConfiguration 和 @SpringBootConfiguration 组成
- @SpringBootConfiguration 与普通 @Configuration 相比,唯一区别是前者要求整个 app 中只出现一次
- @ComponentScan
-
excludeFilters - 用来在组件扫描时进行排除,也会排除自动配置类
-
@EnableAutoConfiguration 也是一个组合注解,由下面注解组成
- @AutoConfigurationPackage – 用来记住扫描的起始包
- @Import(AutoConfigurationImportSelector.class) 用来加载
META-INF/spring.factories
中的自动配置类
为什么不使用 @Import 直接引入自动配置类
有两个原因:
- 让主配置类和自动配置类变成了强耦合,主配置类不应该知道有哪些从属配置
- 直接用
@Import(自动配置类.class)
,引入的配置解析优先级较高,自动配置类的解析应该在主配置没提供时作为默认配置
因此,采用了 @Import(AutoConfigurationImportSelector.class)
- 由
AutoConfigurationImportSelector.class
去读取META-INF/spring.factories
中的自动配置类,实现了弱耦合。 - 另外
AutoConfigurationImportSelector.class
实现了 DeferredImportSelector 接口,让自动配置的解析晚于主配置的解析
8. Spring 中的设计模式
要求
- 掌握 Spring 中常见的设计模式
1. Spring 中的 Singleton
请大家区分 singleton pattern 与 Spring 中的 singleton bean
- 根据单例模式的目的 Ensure a class only has one instance, and provide a global point of access to it
- 显然 Spring 中的 singleton bean 并非实现了单例模式,singleton bean 只能保证每个容器内,相同 id 的 bean 单实例
- 当然 Spring 中也用到了单例模式,例如
- org.sp
- 点赞
- 收藏
- 关注作者
评论(0)