2020面试题总结Spring篇_一目斋

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、讲讲Spring的加载流程。

这个有点长,,,建议大体读一遍spring源码。可以参考这篇文章:Spring初始化加载流程分析

2、Spring AOP的实现原理。

Spring AOP的面向切面编程,是面向对象编程的一种补充,用于处理系统中分布的各个模块的横切关注点,比如说事务管理、日志、缓存等。它是使用动态代理实现的,在内存中临时为方法生成一个AOP对象,这个对象包含目标对象的所有方法,在特定的切点做了增强处理,并回调原来的方法。

Spring AOP的动态代理主要有两种方式实现,JDK动态代理和cglib动态代理。JDK动态代理通过反射来接收被代理的类,但是被代理的类必须实现接口,核心是InvocationHandler和Proxy类。cglib动态代理的类一般是没有实现接口的类,cglib是一个代码生成的类库,可以在运行时动态生成某个类的子类,所以,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

3、讲讲Spring事务的传播属性。

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作。如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

事务的传播行为,指的是当前带有事务配置的方法,需要怎么处理事务。

例如,方法可以继续在当前事务中运行,也可能开启一个新的事务,并在自己的事务中运行。

有一点需要注意,事务的传播级别,并不是数据库事务规范中的名词,而是Spring自身所定义的。通过事务的传播级别,Spring才知道如何处理事务,是创建一个新的事务,还是继续使用当前的事务。

在TransactionDefinition接口中,定义了三类七种传播级别。如下:

//TransactionDefinition.java

//==========支持当前事务的情况==========

/**

*如果当前存在事务,则使用该事务。

*如果当前没有事务,则创建一个新的事务。

*/

int PROPAGATION_REQUIRED=0;

/**

*如果当前存在事务,则使用该事务。

*如果当前没有事务,则以非事务的方式继续运行。

*/

int PROPAGATION_SUPPORTS=1;

/**

*如果当前存在事务,则使用该事务。

*如果当前没有事务,则抛出异常。

*/

int PROPAGATION_MANDATORY=2;

//==========不支持当前事务的情况==========

/**

*创建一个新的事务。

*如果当前存在事务,则把当前事务挂起。

*/

int PROPAGATION_REQUIRES_NEW=3;

/**

*以非事务方式运行。

*如果当前存在事务,则把当前事务挂起。

*/

int PROPAGATION_NOT_SUPPORTED=4;

/**

*以非事务方式运行。

*如果当前存在事务,则抛出异常。

*/

int PROPAGATION_NEVER=5;

//==========其他情况==========

/**

*如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。

*如果当前没有事务,则等价于{@link

TransactionDefinition#PROPAGATION_REQUIRED}

*/

int PROPAGATION_NESTED=6;

当然,绝大数场景下,我们是只用到PROPAGATION_REQUIRED传播级别的。需要注意的是,以PROPAGATION_NESTED启动的事务内嵌于外部事物(如果存在外部事务的话),此时,内嵌事务并不是一个独立的事务,它依赖于外部事务的存在,只有通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交。这点类似于JDBC中的保存点(SavePoint)概念,嵌套的子事务就相当于保存点的一个应用,一个事务中可以包括多个保存点,每一个嵌套子事务。另外,外部事务的回滚也会导致嵌套子事务的回滚。

参考链接:可能是最漂亮的Spring事务管理详解

4、Spring如何管理事务的,怎么配置事务。

所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。Spring提供两种类型的事务管理:

声明式事务,通过使用注解或基于XML的配置事务,从而事务管理与业务代码分离。

编程式事务,通过编码的方式实现事务管理,需要在代码中显示的调用事务的获得、提交、回滚。它提供了极大的灵活性,但维护起来非常困

难。

实际场景下,我们一般使用SpringBoot+注解(@Transactional)的声明式事务。Spring的声明式事务管理建立在AOP基础上,其本质是在目标方法执行前进行拦截,在方法开始前创建一个事务,在执行完方法后根据执行情况提交或回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不用侵入业务代码,只需要在配置文件中做相关的事物声明就可将业务规则应用到业务逻辑中。和编程式事务相比,声明式事务唯一的不足是只能作用到方法级别,无法做到像编程式事务那样到代码块级别。

具体可以去看Spring事务管理-编程式事务、声明式事务。

5、说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。

在bean的scope属性中,当值是singleton表示单例,当值是prototype表示多例。

单例:多次用factory.getBean("user",user.class)获取实体类,获得是同一类。

多例:多次用factory.getBean("user",user.class)获取实体类,获得是多个类。

6、Spring MVC中DispatcherServlet工作流程。

DispatcherServlet工作流程可以用一幅图来说明。

①发送请求

相关文档
最新文档