JDK 动态代理和CGLIB 动态代理
JDK 动态代理
JDK 动态代理是面向接口的代理方式,其实现的原理是基于 InvocationHandler 接口,利用反射生成一个代理接口的匿名类,然后调用 invoke 方法。
1:IUserService 接口。
public interface IUserService {// 查询用户void listUser();// 新增用户void saveUser(String userName, String password);// 修改用户void updateUser(String userName, String password);// 删除用户void delUser(Long userId);
}
2:UserServiceImpl 实现类。
@Slf4j
@Service
public class UserServiceImpl implements IUserService {@Overridepublic void listUser() {log.info("-----listUser-----");}@Overridepublic void saveUser(String userName, String password) {log.info("-----saveUser-----, {}, {}", userName, password);}@Overridepublic void updateUser(String userName, String password) {log.info("-----updateUser-----, {}, {}", userName, password);}@Overridepublic void delUser(Long userId) {log.info("-----delUser-----, {}", userId);}
}
3:JdkProxy 代理类。
public class JdkProxy implements InvocationHandler {// 目标对象private Object target;// 将目标对象转换为代理对象,代理对象执行方法进入到切面类中的invoke方法。public Object getProxyObject(Object target) {this.target = target;// params1:目标对象的类加载器// params2:目标对象实现的接口// params3:切面类引用return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Jdk动态代理,监听开始!");// 目标对象执行方法Object invoke = method.invoke(target, args);System.out.println("Jdk动态代理,监听结束!");System.out.println("------------------------------");return invoke;}
}
4.测试用例。
public class MainTest {public static void main(String[] args) {UserProxy userProxy = new UserProxy();IUserService userService = (IUserService) userProxy.getProxyObject(new UserServiceImpl());userService.listUser();userService.saveUser("yppah", "123456");userService.updateUser("yppah", "123123");userService.delUser(1L);}
}
测试结果。
Jdk动态代理,监听开始!
09:35:24.237 [main] INFO com.xpy.two.UserServiceImpl - -----listUser-----
Jdk动态代理,监听结束!
------------------------------
Jdk动态代理,监听开始!
09:35:24.239 [main] INFO com.xpy.two.UserServiceImpl - -----saveUser-----, yppah, 123456
Jdk动态代理,监听结束!
------------------------------
Jdk动态代理,监听开始!
09:35:24.240 [main] INFO com.xpy.two.UserServiceImpl - -----updateUser-----, yppah, 123123
Jdk动态代理,监听结束!
------------------------------
Jdk动态代理,监听开始!
09:35:24.241 [main] INFO com.xpy.two.UserServiceImpl - -----delUser-----, 1
Jdk动态代理,监听结束!
------------------------------
CGLIB 动态代理
CGLIB 动态代理是面向类的代理方式,其实现的原理是基于ASM 开源包,加载被代理类的字节码文件,通过修改字节码生成一个子类,覆盖并增强其中的方法。
1:导入 cglib 的依赖。
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
2:CglibProxy 代理类。
public class CglibProxy implements MethodInterceptor {private Object target;@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Cglib动态代理,监听开始!");Object invoke = method.invoke(target, args);System.out.println("Cglib动态代理,监听结束!");System.out.println("------------------------------");return invoke;}public Object getCglibProxy(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);Object result = enhancer.create();return result;}
}
3:测试用例。
public class MainTest {public static void main(String[] args) {// jdkProxy();cglibProxy();}public static void jdkProxy() {JdkProxy jdkProxy = new JdkProxy();IUserService userService = (IUserService) jdkProxy.getProxyObject(new UserServiceImpl());userService.listUser();userService.saveUser("yppah", "123456");userService.updateUser("yppah", "123123");userService.delUser(1L);}public static void cglibProxy() {CglibProxy cglibProxy = new CglibProxy();IUserService userService = (IUserService) cglibProxy.getCglibProxy(new UserServiceImpl());userService.listUser();userService.saveUser("yppah", "123456");userService.updateUser("yppah", "123123");userService.delUser(1L);}
}
4:测试结果。
Cglib动态代理,监听开始!
09:35:24.335 [main] INFO com.xpy.two.UserServiceImpl - -----listUser-----
Cglib动态代理,监听结束!
------------------------------
Cglib动态代理,监听开始!
09:35:24.335 [main] INFO com.xpy.two.UserServiceImpl - -----saveUser-----, yppah, 123456
Cglib动态代理,监听结束!
------------------------------
Cglib动态代理,监听开始!
09:35:24.335 [main] INFO com.xpy.two.UserServiceImpl - -----updateUser-----, yppah, 123123
Cglib动态代理,监听结束!
------------------------------
Cglib动态代理,监听开始!
09:35:24.335 [main] INFO com.xpy.two.UserServiceImpl - -----delUser-----, 1
Cglib动态代理,监听结束!
------------------------------
JDK 动态代理和CGLIB 动态代理相关推荐
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...
- jdk动态代理和cglib动态代理实现及区别
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...
- Java两种动态代理JDK动态代理和CGLIB动态代理
目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...
- Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现
AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)
目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...
最新文章
- Python---根据字符串导入包(importlib)
- qt creater创建自己的第一个小程序
- 网络服务器开发总结(转:http://my.oschina.net/u/181613/blog/596022)
- C#中容器控件GroupBox、Panel、TabControl
- Matlab--colorbar的各项细节操作
- Spring实现多数据源配置
- oracle多用户导出导入用法
- kmeans算法中的sse_k-means聚类算法原理与参数调优详解
- 【快速乘与快速幂例题讲解】相乘取余爆long long?试试快速乘吧!
- Rog14 Win10系统迁移新的三星固态硬盘
- linux分区卡住,紧张!正在安ubuntu9.10,分区卡住!
- IT行业十大热门职位
- 《利用python进行数据分析》第二版 第13章-Python建模库介 学习笔记
- atof(),atoi(),itoa(),sprintf()等用法总结
- 超实数与单子(Monad)
- iPhone游戏编程实例:分享成功游戏开发人员的锦囊妙计
- Html5禁止浏览器后退,多页面网站禁用浏览器后退键
- python音频 降噪_Python | 简单的扩音,音频去噪,静音剪切
- Learning TypeScript 0x3 面向对象编程
- Mybatis提取BigDecimal字段值显示丢失末尾0精度的问题解决
热门文章
- OpenCV4机器学习(一):OpenCV4+VS2017环境搭建与配置
- 推荐一款使用快捷的免费文字识别OCR(图片转文字)在线服务
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
- ERP生产线管理系统 with WAMP
- 【118期分享】简约商务PPT模板免费下载
- 用MUI花两天时间快速开发『One·一个』App,兼容Android、iOS双平台
- 日本老人租妻女,“共享家庭”能用来抵抗孤独吗?
- 立足于软硬“解耦”的软件定义网络
- 390计算机毕业设计
- c预言plc编程语言,【讨论】对于PLC的编程语言STL、LAD、SCL等,你用的哪种语言呢?...