掘金 后端 ( ) • 2024-06-30 23:26

傻笑的小埋

                                                                     今天你学习了吗?
                                                                        你竟然没学?
                                                          你这个年纪怎么敢天天都在玩呀?

前言

本文所整理的内容,参考于 ~某站~ 搜索 ~八股文~ 的第一个视频的内容,那个视频全部跟完需要花整整一天,为了节省时间,笔者做了一个快速整理,方便查阅

关于SpringSpringboot的八股知识点,思维导图如下。

Spring-八股文知识点整理.jpg

笔者有一个关于SpringSpringboot专栏,欢迎大家订阅

正文

一. Spring

1. Bean是线程安全的吗

Spring中的Bean有两种作用范围

  1. SingletonBeanIoc容器中只有一个实例;
  2. PrototypeBeanIoc容器中可以有多个。

如果是SingletonBean,那么Bean不是线程安全的。

2. 什么是AOP

AOP就是面向切面编程,用于将与业务无关,但是却对多个Bean产生影响的公共逻辑抽取并封装成一个可重用的模块,该模块称为切面,好处如下。

  1. 减少重复代码
  2. 非业务逻辑与业务代码解耦
  3. 提高代码可维护性

3. AOP是怎么实现的

AOP中的切面主要由切点通知组成,其中。

  1. 切点决定通知逻辑对在哪里生效。比如切点是一个@RequestMapping注解,那么对应的通知的逻辑就会对所有由@RequestMapping注解修饰的方法生效;
  2. 通知决定要做什么。通知其实就决定我们的切面最终要做的行为是什么。

那么如果一个Bean有方法被切面切到了,那么这个Bean会经过下面这样的过程。

  1. Bean创建出来后会在Bean后置处理器中被生成动态代理对象。这里的动态代理可以是JDK动态代理,也可以是CGLIB动态代理;
  2. Bean中被切面切的方法创建通知链并拦截方法调用。打个比方,有一个Bean,其method() 方法被两个切面给切了,那么这两个切面对应的通知会组成通知链,然后再将通知链封装成方法拦截器链,拦截的目标方法就是method() 方法,从而调用method() 方法时就可以执行到通知的逻辑。

AOP的详细实现,可以阅读一下下面两篇文章。

详细分析Spring的AOP源码上篇
详细分析Spring的AOP源码下篇

4. 事务原理

这里说的事务,指的是基于@Transactional注解的声明式事务

Spring中实现事务,其实本质就是通过AOP来实现的,@Transactional注解修饰的方法执行前后,Spring的事务管理器会帮我们进行事务的一系列操作。

Spring的事务的具体实现机制,展开讲的话内容太多,感兴趣可以参考下面这篇文章。

工作忙到死也要学会的Spring事务原理

~有人反馈说太催眠了,所以上面这篇文章建议只看总结部分~

5. 事务失效

事务失效分两大类来讨论。

第一类就是@Transactional注解没起作用。因为使用@Transactional注解是基于AOP来实现的,所以AOP会失效的情况,事务就会失效,比如从Bean的一个没有由@Transactional注解修饰的方法调用到Bean的一个由@Transactional注解修饰的方法,此时这个由@Transactional注解修饰的方法是不会生效事务的。

第二类就是@Transactional注解起作用了但是异常没抛对。这种情况多是@Transactional注解上指定的回滚异常和实际抛出的异常不匹配,导致应该回滚的场景却没有回滚。

6. Bean的生命周期

一图流。

Spring-生命周期流程图

7. 循环依赖

结合下述流程图理解循环依赖。

Spring-循环依赖示意图

至于一级缓存二级缓存三级缓存的作用,请直接去看一文彻底明白Spring的循环依赖的第四五六节的内容,这里不再重复贴出。

请注意,在Springboot2.6.0版本开始,默认是不支持循环依赖的,如果存在循环依赖会启动报错。

二. SpringMVC

1. SpringMVC执行流程

SpringMVC的执行流程图如下。

Spring-SpringMVC执行流程图

SpringMVC中,有两个最为重要的类,其一是RequestMappingHandlerMapping,其二是RequestMappingHandlerAdapter

RequestMappingHandlerMapping的作用是将Controller类里面所有的@RequestMapping注解解析并生成RequestMappingInfo,然后建立起HandlerController),HandlerMethodController类里被@RequestMapping注解修饰的方法)和RequestMappingInfo的映射关系,那么在请求到来时就会根据Request去匹配RequestMappingInfo,进而就得到对应的HandlerMethod

RequestMappingHandlerAdapter的作用有三部分,首先在执行HandlerMethod之前会使用参数解析器从Request中获取执行HandlerMethod需要的参数,然后基于反射执行HandlerMethod,最后使用返回值处理器将HandlerMethod的返回值写入响应体中。

关于SpringMVC的详细执行流程,可以阅读下面两篇文章。

详解SpringMVC-RequestMappingHandlerMapping
详解SpringMVC-RequestMappingHandlerAdapter

三. Springboot

1. Springboot自动装配原理

Springboot项目的启动类需要由@SpringBootApplication注解修饰,该注解复合了如下三个注解。

  1. @SpringBootConfiguration。表明Springboot启动类是一个配置类;
  2. @ComponentScan。会将指定路径下的被特定注解修饰的类加载为Spring中的Bean,这些特定注解为@Component,@Controller,@Service,@Repository和@Configuration注解;
  3. @EnableAutoConfiguration。用于开启Springboot的自动装配。

所以Springboot自动装配是基于@EnableAutoConfiguration注解,该注解功能由如下两部分实现。

其一是@AutoConfigurationPackage。@AutoConfigurationPackage注解作用在Springboot启动类上,会向Spring容器注册一个类型为AutoConfigurationPackages.BasePackagesBean,这个Bean中保存了Springboot启动类的包路径,后续Springboot就会扫描这个包路径下由@Component,@Controller,@Service,@Repository和@Configuration注解修饰的类。

其二是@Import(AutoConfigurationImportSelector.class)。这个作用原理用下图进行示意。

Springboot-自动装配流程图

也就是通过@Import注解导入了AutoConfigurationImportSelector,后续就会调用到SpringFactoriesLoader去扫描并加载该项目和该项目引用的Jar包的classpath路径下META-INF/spring.factories文件中配置的所有的EnableAutoConfiguration

关于Springboot的自动装配,可以参考下面这篇文章。

一文学会Springboot的自动装配机制

除此之外,和自动装配比较相关的内容是Springboot下如何自定义Starter包,可以参考下面这篇文章。

详解Spring的SPI机制和自定义Springboot的Starter包


总结不易,如果本文对你有帮助,烦请点赞,收藏加关注,谢谢帅气漂亮的你。

吃东西的小埋