一、Spring支持的几种bean的作用域
(1)singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
(2)prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
(3)request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
(5)global-session:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效。
二、Spring框架中的单例Beans是线程安全的么
Spring框架并没有对单例bean进行任何多线程的封装处理。 Spring框架并没有对单例bean进行任何多线程的封装处理。如果bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
三、Spring如何处理线程并发问题
只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题
四、Spring 框架中都用到了哪些设计模式
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
五、Spring事务的实现方式和实现原理
1、前提:Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
–binlog:是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,查询不会记录。
主要作用是用于数据库的主从复制及数据的增量恢复。
–redo.log :redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。
2、spring事务的种类:编程式事务管理和声明式事务管理。
(1)编程式事务管理使用TransactionTemplate。
(2)声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
(3)区别:
声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。
声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
六 、Spring事务的4种特性ACID
什么是事务:逻辑上的一组操作,组成这个操作的各个逻辑单元,要么全部成功,要么全部失败。
原子性(atomicity):强调事务的不可分割。
一致性(consistency):事务执行前后数据的完整性保持一致。即一组操作中的各个逻辑单元执行结果保持一致。
隔离性(isolation):一个事务的执行过程中,不会受到其他事务的干扰。
持久性(durability):事务一旦结束,数据就会持久化到数据库。
不考虑事务的隔离性引发的安全问题有
脏读:一个事务读到了另一个事务未提交的数据。
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。
PS:事务1内读取了一个数据未结束,但是事务2对这条数据进行了修改(update 、delete),当事务1再次读取时,那么两次读取的结果不一样,这种情况发生在for循环读取的时候。
幻读:一个事务读到了另一个事务已经insert的数据,导致多次查询结果不一致。
PS:同不可重复读一样,只是读到了另一个事务insert的数据。
七、 Spring中的5种隔离级别:
概述:isolation是设定事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。
① ISOLATION_DEFAULT:这是个 事务管理器(PlatfromTransactionManager) 默认的隔离级别,使用数据库默认的事务隔离级别。但是数据库Msql默认的隔离级别为REPEATABLE_READ(可重复读)
② ISOLATION_READ_UNCOMMITTED:未提交读,允许另外一个事务可以看到这个事务未提交的数据。脏读,不可重复读,虚读都有可能发生
③ ISOLATION_READ_COMMITTED:已提交读,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。避免脏读。但是不可重复读和虚读有可能发生
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。避免脏读和不可重复读.但是虚读有可能发生
⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。避免了脏读。不可重复度,幻读。
查看当前数据库隔离级别:SELECT @@tx_isolation
八、 spring的事务7种传播行为:
spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
- 保证同一个事务中
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
- 保证没有在同一个事务中
④ PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行
九 、Spring到底使用的是JDK代理,还是cglib代理呢
混合使用。如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,就用用cglib代理。