JDK动态代理与CGLIB动态代理的区别
JDK动态代理
CGLIB动态代理
原理区别
JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体的方法之前调用InvocationHandler
CGLIB动态代理是利用ASM开源包,对被代理类的class文件进行字节码修改,生成被代理类的子类,覆盖目标方法。
依赖区别
JDK动态代理,不需要第三方的库,只要JDK环境就可以;
CGLIB动态代理,需要加入cglib、asm的类库
要求区别
JDK动态代理,被代理的类必须有实现的接口
CGLIB动态代理,针对具体的实现类进行代理,但是类不能用final修饰。
编程区别
JDK动态代理,需要实现InvocationHandler接口编写增强、使用Proxy.newInstance获取代理对象
CGLIB动态代理,实现MethodInterceptor接口中的invoke方法实现增强,使用Enhancer根据被代理对象和增强修改字节码文件
SpringAOP
spring底层动态代理默认使用JDK动态代理,也可以使用CGLIB动态代理但需要指定,JDK目标对象必须实现一个接口,若不实现则会默认使用CGLIB动态代理
怎么理解SpringAOP:
springAOP是spring核心功能之一,AOP 面向切面编程,是一种对面向对象的补充,将核心和附加代码的解耦,(下单和支付的过程中需要一些日志,日志写到一起就是强耦合了,使用面向切面编程,就可以进行一定程度的分离,在不影响核心代码的同时,可以去修改附加代码)
spring AOP通知类型都有哪些:前置,后置,环绕,异常,最终
Joint Point(连接点) 程序执行的某个特定位置,该位置标识执行额外功能的位置
PointCut(切入点) 判断在哪些连接点上执行操作的断言
Advice(通知/增强) 运行期需要执行的额外功能,例如:记录日志、权限控制等
Target(目标) 被代理的目标对象
Proxy(代理) 代理对象
Weaving(织入) 把增强应用到目标对象来创建代理对象的过程。
Aspect(切面) 切入点和增强的组合,即标识在哪些连接点进行怎样的增强