spring核心面试技术(持续更新)
Posted 醉酒的小男人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring核心面试技术(持续更新)相关的知识,希望对你有一定的参考价值。
事务
事务定义
事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败
四大特性
原子性(atomicity):强调事务的不可分割.
一致性(consistency):事务的执行的前后数据的完整性保持一致.
隔离性(isolation):一个事务执行的过程中,不应该受到其他事务的干扰.
持久性(durability):事务一旦结束,数据就持久到数据库
事务并发会带来什么问题
脏读:一个事务读到了另一个事务的未提交的数据
不可重复读:一个事务读到了另一个事务已经提交的update的数据导致多次查询结果不一致
虚幻读:一个事务读到了另一个事务已经提交的insert的数据导致多次查询结果不一致
隔离级别
DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(readuncommited):脏读,不可重复读,虚读都有可能发生
已提交读(readcommited):避免脏读。但是不可重复读和虚读有可能发生
可重复读(repeatableread):避免脏读和不可重复读.但是虚读有可能发生
串行化(serializable):避免以上所有读问题.
mysql默认:可重复读
Oracle默认:读已提交
事物的传播机制
1.PROPAGATION_REQUIRED:支持当前事务,如果没有事务会创建一个新的事务。
2.PROPAGATION_SUPPORTS:支持当前事务,如果没有事务的话以非事务方式执行。
3.PROPAGATION_MANDATORY:支持当前事务,如果没有事务抛出异常。
4.PROPAGATION_REQUIRES_NEW:创建一个新的事务并挂起当前事务。
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务则将当前事务挂起。 6.PROPAGATION_NEVER:以非事务方式进行,如果存在事务则抛出异常。
7.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
Bean的作用域
singleton:在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值.
prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean().
request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境.
session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的SpringWebApplicationContext环境.
application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的SpringWebApplicationContext环境
自动装配
no:默认的方式是不进行自动装配,通过显式设置ref属性来进行装配。
byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的bean。
byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如 果有多个bean符合条件,则抛出错误。 -
constructor:这个方式类似于byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。
IOC控制反转
所谓控制反转,就是把原先我们代码里面需要实现的对象的创建、依赖的代码,反转给容器来帮忙实现。
DI依赖注入
依赖注入,就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。
BeanFactory和FactoryBean的区别
BeanFactory是一个最基础的IOC容器,提供了依赖查找,依赖注入等基础的功能
FactoryBean是创建Bean的一种方式,帮助实现复杂Bean的创建(getBean返回的是getObject()方法返回的对象,getBean(&beanName)获取的是实现FactoryBean的对象)
ApplicationContext和BeanFactory的区别
BeanFactory是一个最基础的IOC容器,提供了依赖查找,依赖注入等基础的功能
ApplicationContext继承了BeanFactory,在BeanFactory的基础上增加了企业级的功能,如AOP,资源管理(Resources)事件(Event),国际化(i18n),Environment抽象等
@Transactional事务在哪些情况下会失效
-事务分为编程式事务和声明式事务
-可以作用在类、方法、接口上
-JDK(JdkDynamicAopProxy)、CGLIB(CglibAopProxy)、AspectJ适配实现
1.@Transactional注解应⽤到⾮public⽅法(除⾮特殊配置,例如使⽤AspectJ静态织⼊实现AOP)
2.⾃调⽤,因为@Transactional是基于动态代理实现的
3.异常在代码中被你自己try catch了
4.异常类型不正确,默认只⽀持RuntimeException和Error,不⽀持检查异常
5.事务传播配置不符合业务逻辑
Autowired和Resource区别
-@Resource是java提供的,@Autowired是spring提供的
-@Autowired:先byType再byName
-@Resource:先byName再byType(当指定@Resource name属性时,只会byName)
BeanPostProcessor和BeanFactoryPostProcessor区别
BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。
BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。
https://blog.csdn.net/xiaowanzi_zj/article/details/117201334
Spring-Bean生命周期
https://www.jianshu.com/p/1dec08d290c1
https://www.bilibili.com/read/cv8507240
Spring MVC
https://www.jianshu.com/p/8a20c547e245
循环依赖
https://segmentfault.com/a/1190000023712597
以上是关于spring核心面试技术(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章