1,什么是aop?
aop指面向切面编程,即对代码原有结构不产生影响的情况下,动态的织入,完成功能的增强
2,aop的实现方式都有哪些?
spring中实现aop的方式主要有jdk原生动态代理实现以及cglib动态代理实现。
jdk动态代理:利用拦截器加反射在编译期生成一个代理接口的匿名实现类,在调用具体方法前调用InvokeHandler来处理
cglib动态代理:利用字节码框架ASM,在运行期动态将class加载进来,通过修改字节码继承代理类来实现,核心思想继承,并注入被代理对象,在切入的方法位置根据配置属性调用被代理对象的方法与切面方法以达到增强的目的
3,两种代理方式的不同点是什么?
底层实现原理不同:jdk原生代理底层使用反射原理,而cglib底层核心原理是继承
条件不同:使用jdk原生代理需要声明一个接口,而无法直接为类生成代理对象,而cglib则可以直接为类生成代理对象,但无法为final修饰的类进行功能增强
效率不同:当只有少量的类需要生成代理类时,jdk自带的代理方式效率高于cglib,因为其在编译期间就会生成代理类,而cglib则是在运行期间生成代理类,所以如果为大量的类需要生成代理对象时,cglib的效率是高于jdk原生代理。
4,spring的事物是如何实现的?
spring使用aop的方式来实现事物管控,使用事物管理器(bean对象),管理器中配置数据源连接池,在执行方法时,通过aop的方式开启链接对象的autocommit方法开启事务,在抛出异常时,调用回滚方法,来达到动态织入方法控制事物的目的。
5,事物失效是否遇到过,如何解决?
当两个被spring事物管理的方法,互相调用时,事物机制配置可能会失效,原因是因为被调用的方法执行对象非spring事物的代理对象,而是注入在代理对象中的普通对象,所以并没有被增强,故事物会失效。解决方法:自己注入自己,或另写一个类,声明方法,然后在主类中调用