Spring 如何实现一个CGLlB动态代理呢?
CGLIB简介说明
CGLIB:(Code Generation Library)是一个高性能开源的代码生成包,它应用于许多AOP框架中,
其底层是通过使用一个小而快的字节码处理框架 ASM(Java 字节码操控框架)转换字节码并生成新的类
CGLIB使用注意事项
使用 CGLIB 需要导入 CGLIB 和 ASM 包,即 asm-x.x.jar 和 CGLIB-x.x.x.jar如果您已经导入了 Spring 的核心包 spring-core-x.x.x.RELEASE.jar
就不用再导入 asm-x.x.jar 和 cglib-x.x.x.jar 了
因为 Spring 核心包中包含 CGLIB 和 asm,即Spring 核心包已集成CGLIB 所需要的包
所以在开发中不需要另外导入asm-x.x.jar 和 cglib-x.x.x.jar 包了。 例
- 创建 SpringDemo 项目
- 在src 目录下创建 com.java265 包
- 导入相关 JAR 包
- 在 com.java265 包下创建 UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和 CGLIBProxy(动态代理类)
- 运行 SpringDemo 项目
package com.java265; public interface UserManager { // 新增用户抽象方法 void addUser(String userName, String password); // 删除用户抽象方法 void delUser(String userName); }UserManagerImpl 类
package com.java265; public class UserManagerImpl implements UserManager { @Override public void addUser(String userName, String password) { System.out.println("正在执行添加用户方法"); System.out.println("用户名称: " + userName + " 密码: " + password); } @Override public void delUser(String userName) { System.out.println("正在执行删除用户方法"); System.out.println("用户名称: " + userName); } }MyAspect 类
package com.java265; public class MyAspect { public void myBefore() { System.out.println("方法执行之前"); } public void myAfter() { System.out.println("方法执行之后"); } }CglibProxy 类
package com.java265; import java.lang.reflect.Method; import org.springframework.CGLIB.proxy.Enhancer; import org.springframework.CGLIB.proxy.MethodInterceptor; import org.springframework.CGLIB.proxy.MethodProxy; /** * CGLIB动态代理,实现MethodInterceptor接口 * * @author 编程帮 * */ public class CglibProxy implements MethodInterceptor { private Object target;// 需要代理的目标对象 final MyAspect myAspect = new MyAspect(); // 重写拦截方法 @Override public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable { myAspect.myBefore(); Object invoke = method.invoke(target, arr);// 方法执行,参数:target目标对象 arr参数数组 myAspect.myAfter(); return invoke; } // 定义获取代理对象方法 public Object getCglibProxy(Object objectTarget) { // 为目标对象target赋值 this.target = objectTarget; Enhancer enhancer = new Enhancer(); // 设置父类,因为CGLIB是针对指定的类生成一个子类,所以需要指定父类 enhancer.setSuperclass(objectTarget.getClass()); enhancer.setCallback(this);// 设置回调 Object result = enhancer.create();// 创建并返回代理对象 return result; } public static void main(String[] args) { CglibProxy cglib= new CglibProxy();// 实例化CglibBProxy对象 UserManager user = (UserManager) cglib.getCglibProxy(new UserManagerImpl());// 获取代理对象 user.addUser("java265.com", "www.java265.com"); // 执行新增方法 user.delUser("java265.com"); // 执行删除方法 } }运行结果---
方法执行之前
正在执行添加用户方法
用户名称: java265.com 密码: www.java265.com
方法执行之后
方法执行之前
正在执行删除用户方法
用户名称: java265.com
方法执行之后
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。