闫平平
写代码也要酷酷的!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

jdk动态代理必须要求目标类实现一个接口。有的时候,程序可能不方便或者我们不想让一个类实现接口,也想创建这个项目类的代理对象,我们可以使用cglib动态代理。

一、引入cglib依赖的jar包

二、创建代理类对象的生成器

复制代码
 1 package com.aaa.proxy;
 2 import com.aaa.proxy.advice.LogAdvice;
 3 import net.sf.cglib.proxy.Enhancerimport net.sf.cglib.proxy.MethodInterceptor;
 4 import net.sf.cglib.proxy.MethodProxy;
 5 import java.lang.reflect.Method/**
 6 * cglib动态代理
 7 */
 8 public class CglibDynamicUtil implements MethodInterceptor {
 9 /**
10 * 创建目标类对象的代理对象
11 * @param target 目标类的对象 目标类不需要实现接口
12 * @return 代理类对象
13 */
14 public Object bind(Object target){
15 Enhancer enhancer = new Enhancer();
16 //传递一个MethodInterceptor接口的实现类对象
17 enhancer.setCallback(this);
18 //传递目标类Class对象
19 enhancer.setSuperclass(target.getClass())return enhancer.create();
20 }
21 @Override
22 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{
23 Object result = methodProxy.invokeSuper(o,objects);
24 //获取方法名
25 String methodName = method.getName();
26 //判断methdnName
27 if(methodName.startsWith("save")||methodName.startsWith("delete")||methodName.startsWith("update")) {
28 new LogAdvice().log(methodName);
29 }
30 return result;
31 }
32 }
复制代码

三、测试

复制代码
 1 package com.aaa.proxy.test;
 2 import com.aaa.proxy.CglibDynamicUtil;
 3 import com.aaa.proxy.entity.User;
 4 import com.aaa.proxy.service.impl.UserServiceImpl;
 5 /**
 6 * cglib动态代理
 7 */
 8 public class Test03 {
 9 public static void main(String[] args) {
10 //创建cglib代理类对象生成器
11 CglibDynamicUtil cglibDynamicUtil = new CglibDynamicUtil();
12 //创建目标类对象
13 UserServiceImpl userService = new UserServiceImpl();
14 //创建代理类对象
15 UserServiceImpl userServiceProxy = (UserServiceImpl)cglibDynamicUtil.bind(userService);
16 userServiceProxy.saveUser(new User());
17 userServiceProxy.findById(10L);
18 }
19 }
复制代码

注意:cglib动态代理不需要目标类实现一个接口。

 

posted on   写代码也要酷酷的  阅读(195)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
 
点击右上角即可分享
微信分享提示