spring 面试题

时间:2022-12-19 17:19:51

spring 面试题

spring boot 、 spring mvc 和spring有什么区别

spring是一个IOC容器,用来管理bean,使用以来植入实现控制反转们可以很方便的整个各种跨能加,提供AOP机制弥补OOP的代码重复问题,更加发个遍将不停方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等

springmvc是spring对web框架的一个解决方案,提供了一个总的前端控制器servlet,用来接收请求,然后定义了一套路由策略(url到handle的映射)即时适配执行handle,将handle结果使用视图解析技术生成视图展现给前端

spring boot是spring提供的一个款苏开发工具包,让程序员更方便,更快速的开发spring+spring mvc应用,简化了配置(约定大于配置),整合了一系列的解决方案(starter机制)、redis、mongodb、es,可以开箱即用

spring 事务的实现方式和原理以及隔离级别?

在使用spring框架时,两种使用事务的方式,一种是编程式,一种是声明式,@Transactional注解就是申明式。

首先,事务这个概念是数据库层面的,spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更加方便操作事务的方式

比如我们可以通过在某个方法上增加@Transactional注解,就可以开启事务,这个方法中所有的sql都会在一个食物中执行,统一成功或失败。

在一个方法上加了@Transactional注解后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当在使用这个代理对象的方法时,如果这个方法上存在@Transactional注解,那么代理逻辑会把bean的自动提交设置为false,然后再去执行原本的业务逻辑方法,如果执行业务逻辑方法没有出现异常,那么代理逻辑中就会将事务进行提交,如果执行业务逻辑方法出现了异常,那么事务会进行回滚

当然,针对哪些异常回滚事务是可以配置的,可以利用@Transactional中的rollbackFor属性进行配置,默认情况下会对RuntimeException和Error进行回滚

spring事务隔离级别就是数据库的隔离级别:外加一个默认级别

  • read uncommitted 未提交读
  • read committed Oracle 提交读 不可重复读
  • repeatable read MySQL 可重复读
  • serialization 可串行化

数据库的配置隔离级别是Read commited,而 spring配置的隔离级别是Repeatable Read,请问这是隔离级别是哪个?

以spring为准,如果spring设置的隔离级别数据库不支持,效果则取决于数据库

spring的事务什么时候会失效

spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了!常见情况如下:

  1. 发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this对象不是代理类,二十UserService对象本身! 解决办法就是让哪个thid编程UserService代理类
  2. 方法不是public
@Transactional 只能用于public的方法上,否则事务不会失效
如果要用在非 public上,可以开启AspectJ代理模式
  1. 数据库本身不支持事务
  2. 没有被spring管理
  3. 异常被吃掉,事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeException)

spring事务传播机制

多个事务方法相互调用时,事务如何在这些方法间传播

方法A是一个事务方法,方法A执行过程中发调用了方法B,那么方法B也有无事务以及方法B对事务的要求都会对方法A的诗句具体造成影响,我那个是方法A的事务对方法B的事务也有影响,这种影响具体是什么就由两个方法所定义的是位于传播类型所决定的

REQUIRED(spring默认的事务传播机制):如果当前(调用方)没有事务,则自己(被调用方)新建一个事务,如果当前存在事务,则加入这个事务

SUPPORTS:如果当前存在事务,则加入事务,如果没有,就以非事务方式运行

MANDATORT:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

REQUIRES_NEW:创建一个新事物,如果存在当前事务,则挂起该事务 (各搞个的)

NOT_SUPPORTED:以非事务的方法运行,如果当前存在事务,则挂起

NEVER:不适用事务,如果存在事务则抛出异常

NESTED:如果当前事务存在,则在嵌套事务中执行,否则和REQUIRED一样(开启一个事务)

spring框架中的单例bean时线程安全的么?

不是线程安全的

spring中的Bean 默认时单例模式的,框架中并没有对bean进行多线程的封装处理。

如果bean时有状态,那就要开发人员自己进行线程安全的保证,最简单的办法就是改变bean的作用域, 把“singleton”改为“protopyte”这样每次请求bean就相当于时new Bean() 这样就可以保证线程的安全了。

  • 有些黄台就是有数据存储功能
  • 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,知识如果知识调用最里面的方法,而且多线程调用一个实例方法,会在内存中赋值变量,中认识自己的线程的弘佐内存,是安全的

spring框架中都用到了哪些设计模式?

简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个茶农i你类

spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建 还是传入参数之前创建这个要根据具体情况来定。

工厂方法:

实现了FactoryBean接口时一类叫做factory的bean。

其特点是:spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是bean.getObject()方法的返回值。

单例模式:保证一个类仅有一个实例,并提供一个发个文她的全局访问点

spring对单例的实现,spring中的单例模式完成了后半句话,既提供了全局饿访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是任意的java对象

适配器模式:

spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法,这样在Controller时,只需要增加一个适配器类就完成springMVC的扩展了。

装饰器模式:动态地给一个对象添加一些额外地指责。就增加功能来说,Decorator模式相比生成子类更为灵活。

spring中用到地包装器在雷鸣上有两种表现,一种时类名中有Wrapper,另一种时类名中含有Decorator。

动态代理:

切面