AOP 动态代理
Spring AOP使用两种代理机制:基于JDK的动态代理;基于CGLIB的动态代理。之所以需要两种,是因为JDK本身只提供接口的代理,不支持类的代理。
JDK动态代理:java.lang.reflect包下的Proxy, InvocationHandler
1.编写一个handler类实现InvocationHandler接口,invoke方法:
public Object invoke(Object target, Method method, Object[] args) throws Throwable { //代理前逻辑 Object obj = methos.invoke(target, args); //代理后逻辑 return obj; }
2.调用Proxy,
Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);//三个参数classLoader, interfaces, 实现invocationHandler的类
GCLib动态代理:JDK的限制:只能为接口创建代理实例.
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,并顺势织入横切逻辑。
1、创建一个CGLibProxy实现MethodInterceptor
package com.billkang; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CGLibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz) { enhancer.setSuperclass(clazz); //设置需要创建子类的类 enhancer.setCallback(this); return enhancer.create(); //通过字节码技术动态创建子类实例 } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("代理前逻辑"); Object result = proxy.invokeSuper(obj, args); System.out.println("代理后逻辑"); return result; } }
ForumServiceImpl) cgLibProxy.getProxy(ForumServcieImpl.class);
由于CGlib采用动态创建子类的方式生成代理对象,所以不能对目标类中的final、private方法进行代理。
对于singleton的代理,推荐使用CGlib,对于其他作用域的代理,最好使用JDK,因为CGlib创建代理的时候慢,而创建出的代理对象运动效率极高,而使用JDK代理的表现刚好相反。
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理jdk静态代理和动态代理
静态代理、动态代理,以及动态代理的调用说明静态代理和动态代理
#yyds干货盘点# 设计模式之静态代理,jdk动态代理,cglib动态代理的区别jdk静态代理和动态代理
代理模式-动态代理详解(JDK动态代理和CGLIB动态代理)jdk cglib动态代理
代理模式-动态代理(基于接口,JDK动态代理)jdk动态代理和cglib动态代理
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )动态代理是代理模式吗
Spring入门第三讲 Spring中的代理 静态代理 动态代理(JDK代理) cglib代理(字节码增强) Spring中的AOPspring的静态代理和动态代理