本文共 3559 字,大约阅读时间需要 11 分钟。
JAVA动态代理基于反射机制,通过生成实现指定接口的匿名类来实现代理。而CGLIB动态代理则是基于ASM框架,对目标类的字节码进行修改或增强,生成一个继承自目标类的子类,从而实现代理功能。
如果目标对象没有实现任何接口,Spring会自动选择CGLIB动态代理,因为JDK动态代理无法处理无接口的目标对象。
添加CGLIB库
spring-boot-dependencies.properties中添加asm-5.2.0.jar和cglib-3.2.5.jar等。配置Spring
package com.lf.shejimoshi.proxy.entity;public interface UserManager { void addUser(String userName, String password); void delUser(String userName);} package com.lf.shejimoshi.proxy.entity;public class UserManagerImpl implements UserManager { @Override public void addUser(String userName, String password) { System.out.println("调用了新增的方法!"); System.out.println("传入参数为 userName: " + userName + " password: " + password); } @Override public void delUser(String userName) { System.out.println("调用了删除的方法!"); System.out.println("传入参数为 userName: " + userName); }} package com.lf.shejimoshi.proxy.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.lf.shejimoshi.proxy.entity.UserManager;import com.lf.shejimoshi.proxy.entity.UserManagerImpl;public class JdkProxy implements InvocationHandler { private Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("JDK动态代理,监听开始!"); Object result = method.invoke(target, args); System.out.println("JDK动态代理,监听结束!"); return result; } private Object getJDKProxy(Object targetObject) { this.target = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public static void main(String[] args) { JdkProxy jdkProxy = new JdkProxy(); UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl()); user.addUser("admin", "123123"); }} package com.lf.shejimoshi.proxy.cglib;import java.lang.reflect.Method;import com.lf.shejimoshi.proxy.entity.UserManager;import com.lf.shejimoshi.proxy.entity.UserManagerImpl;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor { private Object target; @Override public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable { System.out.println("Cglib动态代理,监听开始!"); Object invoke = method.invoke(target, arr); System.out.println("Cglib动态代理,监听结束!"); return invoke; } public Object getCglibProxy(Object objectTarget) { this.target = objectTarget; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(objectTarget.getClass()); enhancer.setCallback(this); return enhancer.create(); } public static void main(String[] args) { CglibProxy cglib = new CglibProxy(); UserManager user = (UserManager) cglib.getCglibProxy(new UserManagerImpl()); user.delUser("admin"); }} 运行以上代码,您可以在控制台中观察到JDK动态代理和CGLIB动态代理的输出结果,分别显示了两种代理方式的工作流程。
转载地址:http://juhs.baihongyu.com/