spring 面试问题


spring bean 的作用域

1.singleton:唯一bean实例,Spring中的bean默认都是单例的。

2.prototype:每次请求都会创建一个新的bean实例。

3.request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

4.session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。

spring mvc 的工作流程

一个请求→DispatcherServlet根据请求信息调用HandlerMapping→转发到固定handler上即Controller→处理完业务后返回ModelAndView对象→DispatcherServlet把返回的Model传给View 最后返回浏览器。

spring 当中的设计模式

单例  工厂(BeanFactory) 代理 springaop(面向切面代理接口)适配器模式(springmv分配hanglermapping) 装饰模式 给类添加额外职责(Decorator)

观察者模式(spring驱动事件) 策略模式(访问resource接口 不同的 resource)  模板模式

spring 控制事务的几种方式

1编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
2基于 TransactionProxyFactoryBean的声明式事务管理
3基于 @Transactional 的声明式事务管理
4基于Aspectj AOP配置事务

spring 事务的隔级别

ISOLATION_DEFAULT:默认隔离界别,Mysql默认采用的REPEATABLE_READ隔离级别;

ISOLATION_READ_UNCOMMITTED:读未提交 可以读取事务中尚未提交的数据  即读出的数据会在提交后变更 可能会导致脏读、幻读或不可重复读。

ISOLATION_READ_COMMITTED:读已提交 一个事物进行了两次数据的读取 两次读取之间读取的数据被其他事物修改 可以阻止脏读,但是幻读或不可重复读仍有可能发生

ISOLATION_REPEATABLE_READ: 重复读 对同一字段的多次读取结果都是一致的 因此如果此时插入一条数据则不会读出此数据也就存在幻读 可以阻止脏读和不可重复读,但幻读仍有可能发生。

ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重

spring 事务的传播行为 七个 

PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。

spring 的理解 

 spring 是一个轻量级框架 更是一个容器  

它可以负责创建和管理对象 从而把程序从复杂的依赖关系中解脱出来 提高了效率 让spring来维护这些对象 和对象之间的依赖关系

还有他是开源的因此他和其他框架结合比较好 目前有更加简化的版本springboot springcloud 出现

spring框架 的aop理解

aop即面向切面编程  什么是面向切面? 就是横切面 举例 不同的业务都要用到登录功能 如果每个业务里都编写登录的话 会特别复杂和浪费时间

如果我们把这些和业务无关的代码封装起来 让不同的业务进行调用 这样是不是形成了一个横切面  提高了开发效率记住封装可是java三大特性之一

这样对于可扩展也有很好提高 也就降低了系统的耦合度

此外 要记住aop的底层实现是动态代理所以 大家可以在详细看一下代理的内容