一、Spring
1.谈谈对AOP的理解
aop面向切面编程,关键在于代理模式,spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在每次运行时再内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。动态代理可以减少系统中的重复代码,降低模块间耦合度,同时提高了系统的可维护性,可用于权限认证、日志、事物处理。
Spring AOP中的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理
- JDK代理:基于接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标中的代码。动态地将横切逻辑和业务编织再一起。接着,proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。
- CGLIB代理:如果代理类没有实现InvocationHandler接口(或者说是基于父子类的),那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以再运行时动态的生成指定类的一个子类对象,并覆盖其中特定的方法并添加增强代码,从而实现AOP
AOP开发步骤
- 创建原始对象
- 提供额外功能(实现下面接口)
- 配置切入点
- 组装切入点和代理功能
2. Spring事物的实现及原理
Spring事物的本质其实就是数据库对事物的支付,没有数据库的事物支持,spring是无法提供事物功能的。
Spring事物的种类
spring支持编程式事物管理和声明式事物管理两种方式:
- 编程式事物管理使用TransactionTemplate
- 声明式事物管理建立再AOP之上。其本质是通过AOP功能,对方法前后进行拦截,将事物处理的功能编织到拦截方法中,也就是目标方法开始前加入一个事物,在执行完目标方法治好根据执行情况提交或者回滚事物。
声明式事物最大的有点就是不需要在业务逻辑代码中掺杂事物管理代码,只需要在配置文件中做相关的事物规则声明或通过@Transaction注解的方式,便可以将事物规则应用到业务逻辑中。
声明式事物管理要优先于编程式,这正是spring倡导的非入侵式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事物支持。唯一不足的地方是,最细粒度只能作用到方法级别,无法做到像编程式事物那样可以作用到代码块级别。
Spring的事物传播行为
spring事物的传播行为说的是,当多个事物同时存在的时候,spring如何处理这些事物的行为。
- PROPAGATION_REQUIRED:如果当前没有事物,将创建一个新事物,如果当前存在事物,就加入该事物,该设置是最常用的设置。
- PROPAGATION_SUPPORTS:支持当前事物,如果当前存在事物,就加入该事物,如果当前不存在事物,就以非事物执行。
- PROPAGATION_MANDATORY:支持当前事物,如果当前存在事物,就加入该事物,如果当前不存在事物,就抛出异常。
- PROPAGETION_REQUIRES_NEW:创建新事物,无论当前存不存在事物,都创建新事物。
- PROPAGATION_NOT_SUPPORTED:以非事物方式执行操作,如果当前存在事物,就把当前事物挂起。
- PROPAGATION_NEVER:以非事物方式执行,如果当前存在事物,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事物,则在嵌套事物内执行。如果当前没有事物,则按REQUIRED属性执行。
Spring中的隔离级别
- ISOLATION_DEFAULT:这个是platfromTransactionManager默认的隔离级别,使用数据库默认的事物隔离级别。
- ISOLATION_READ_UNCOMMITTED:读未提交,允许另一个事物可以看到这个事物未提交的数据。
- ISOLATION_READ_COMMITTED:读已提交,保证一个事物修改的数据提交后,才能被另一个事物读取,而且能看到该事物对已有记录的更新。解决脏读问题
- ISOLATION_REPEATABLE_READ:可重复读,保证一个事物修改的数据提交后才能被另一个读取,但不能看到该事物对已有记录的更新。行锁
- ISOLATION_SERIALIZABLE:一个事物在执行的过程中,完全看不到其他事物对数据库所做的更新操作。锁表
3.Spring框架中都用到了哪些设计模式
- 工厂模式:BeanFactory就是简单的工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean默认为单例模式
- 代理模式:Spring的AOP功能用到了JDK动态代理和CGLIB字节码生成技术
- 模板方法:用来解决代码重复的问题,比如:RestTemplate,Jms Template等;
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被自动更新,如Spring中listener的实现-ApplicationListenter
4.Spring如何处理线程并发问题
一般情况下,只有无状态的Bean才可以再多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态,采用ThreadLocal进行处理,解决线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程再访问前需要获取锁,没获得锁的线程则需要排队,而ThreadLocal采用了“空间换时间”的方式。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都用油自己的变量副本,从而也就没有必要对该比那里进行同步了。TreadLocal提供了线程安全的共享对象,在编写多线程代码中,可以把不安全的变量封装进行ThreadLocal。