前言:
开始分享之前,博客主要是为了记录学习。在学习过程中不免会出现错误,也欢迎大家在评论区指正。我会认真回复大家的。谢谢!!
内容介绍
八股文学习,学习了Spring,SpringMVC,SpringBoot,MyBatis的相关知识。内容来源于B站
学习总结
一、Spring框架中的单例bean是线程安全的吗?(场景:多线程并发执行情况下,对单例状态的修改)
不是线程安全的,spring框架中有一个@Scope注解,其默认的值是singleton(单例的)
因为一般情况下,spring的bean一般都是注入无状态的对象(Service类和DAO类),没有线程安全的问题。
但是在一个bean中出现了可修改的成员变量时,是有线程安全的问题,可以通过使用多例(prototype)或者加锁来解决
二、Spring中AOP的相关理解
1.什么是AOP?
面向切面的编程,用于将那些与业务无关的,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。
2.项目中使用到的AOP,有那些?
记录操作日记,缓存,spring实现的事务;
核心是:使用AOP中的环绕通知+切点表达式(找到要记录日记的方法),通过环绕通知的参数获取请求方法的参数,获取到这些参数以后,保存到数据库。
3.Spring中的事务是如何实现的?
本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后,根据执行情况提交或者事务回滚。
三、Spring中事务失效的场景有那些?
1.异常捕获处理,自己处理异常,并没有抛出。
解决:手动抛出
2.抛出检查异常。
解决:使用@RollBackFor注解,属性值为Exception
3.非public方法导致的事务失效
解决:改成public
四、Spring的bean的生命周期
1.spring将xml文件有关bean的东西封装成BeanDefinition。
2.从BeanDefinition中获取bean的定义信息
3.构找函数:使用构找函数实例化bean
4.依赖注入:一般是set进行属性注入
5.Aware接口:处理Aware接口(BeanNameAware,BeanFactoryAware,ApplicationContextAware)
6.BeanPostProcessor#before:Bean的后置处理器BeanPostProcessor-前置
7.初始化方法:(InitializingBean,init-method)
8.BeanPostProcessor#after:Bean的后置处理器BeanPostProcessor-后置
9.销毁bean
五、Spring中的循环依赖怎么解决?
1.定义:循环依赖其实就是循环利用。也就是两个及以上的bean互相持有对方,最终形成闭环。
2.原因:循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分额循环依赖(除去构造函数注入的)
注!!!!
如何解决构方法出现的循环依问题,怎么解决?
解决:因为构造函数在bean的生命周期第一步执行,spring不能解决,需要使用==@Lazy==注解来解决,即需要的时候在创建bean对象。
a.一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象。
b.二级缓存:缓存早期的bean对象(生命周期还没走完)
c.三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
六、SpringMVC的执行流程?(记图)
执行流程分为老版本和前后段分离两种:
其中核心组件:前端控制器(DispatchServlet),处理映射器(HandlerMapping),处理适配器(HandlerAdaptor), 视图解析器(ViewResolver)
1.浏览器给前端控制器发送请求,在查询handler,处理映射器查询到结果封装成HandlerExecutionChain返回给前端控制器。
2.前端控制器在执行Handler,处理器适配器找到对应的处理器Handler/Controller,响应给处理适配器,在以modleAndView对象给前端控制器
3.前端控制器将结果返回给视图解析器,将逻辑视图解析为真正视图返回View对象给前端控制器。
4.前端控制器进行渲染视图,返回结果给浏览器。
1.浏览器给前端控制器发送请求,在查询handler,处理映射器查询到结果封装成HandlerExecutionChain返回给前端控制器。
2…前端控制器在执行Handler,处理器适配器找到对应的处理器Handler/Controller,通过方法上添加@ResponseBoby,使用HttpMessageConverter来返回结果转化为JSON并响应。
七、SpringBoot的自动装配原理
1.在Spring Boot项目中的引导类上有一个@SpringBootAppilication这个注解,由@SpringBootConfiguration+@EnableAutoConfiguration+@ComponScan组成
2.主要介绍 @EnableAutoConfiguration是实现自动化配置的核心注解,该注解通过@Import注解导入对应的配置类选择器。内部就是读取了该项目和该项目引用的jar包的Classpath路径下 META-INF/spring.factories文件中所配置的类的全类名。在这些配置类中所定义的Bean会根据注解所指定的条件来决定是否需要将其导入到Spring容器中。
3.条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,没有就新建。把这个配置类所有的Bean放入spring容器中使用。
八、Spring,SpringMVC,SpringBoot注解有哪些?
Spring注解:bean对象的@Component(@Controller,@Service,@Repository)+@bean,依赖注入的@Autowired+@Qualifier,Bean的作用域@Scope,配置类@Configuration,包相关的@ComponentScan+@Import,切面@Aspect+@Before+@After+@Around+@Pointcut
SpringMVC注解:Http的有关注解@RequestMapping,@RequestBoby,@RequestParam,@PathViriable,@RequestHeader,@ResponseBoby,@RestController
SpringBoot注解:@SpringBootApplication = @SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
九、MyBatis执行流程?(配置文件,工厂,会话对象,Executor接口,MappedStateMent方法,数据转换)
1.读取MyBatis配置文件:mybatis-config.xml(如今的ymal,yml,proprieties)加载运行环境和映射文件
2.构找会话工厂SqlSessionFactory
3.会话工厂创建SqlSession对象(包含了执行SQl语句的所有方法)
4.操作数据库的接口,即Executor执行器,同时负责查询缓存的维护
5.Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
6.输入参数映射
十、Mybatis是否支持延迟加载?延迟加载的底层原理知道吗?
支持,延迟加载就是在需要用到数据时才会进行加载,不需要用到数据时就不加载数据。
Mybatis还支持一对一关联对象和一对多关联集合对象的延迟加载。
在其配置文件中,可以配置是否启用延迟加载LazyLoadingEnable=true|false,默认是关闭的。
底层原理:
1.使用CGLIB创建目标对象的代理对象
2.当调用目标方法时,进入拦截器invoke方法,发现目标方法时null值,执行sql查询
3.获取数据以后,调用set方法设置属性之后。再继续查询目标方法,就有值了。
十一、Mybatis的一级,二级缓存用过吗?二级缓存在什么时候会清理缓存中的数据?(不怎么熟悉)
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache即将清空。默认打开一级缓存。
二级缓存:基于namespace和mapper的作用域起作用,不是依赖于SQLSession,默认也是采用PerpetualCache,HashMap存储。此缓存需要单独开启。一个是核心配置,一个是mapper映射文件。
当某一个作用域(一级缓存Session/二级缓存NameSpace)的进行了新增,修改,删除操作后,默认该作用域下所有select中的缓存被clear
心得体会
虽然这些知识点比较难,但是学了几遍之后,还是比较容易掌握。