学习日记------八股文

前言:
开始分享之前,博客主要是为了记录学习。在学习过程中不免会出现错误,也欢迎大家在评论区指正。我会认真回复大家的。谢谢!!

内容介绍

八股文学习,学习了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

心得体会

虽然这些知识点比较难,但是学了几遍之后,还是比较容易掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值