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 动态代理相关推荐

  1. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  2. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  3. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

    大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...

  4. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  5. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  6. jdk动态代理和cglib动态代理实现及区别

    代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...

  7. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  8. Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现

    AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...

  9. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  10. 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)

    目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...

最新文章

  1. Python---根据字符串导入包(importlib)
  2. qt creater创建自己的第一个小程序
  3. 网络服务器开发总结(转:http://my.oschina.net/u/181613/blog/596022)
  4. C#中容器控件GroupBox、Panel、TabControl
  5. Matlab--colorbar的各项细节操作
  6. Spring实现多数据源配置
  7. oracle多用户导出导入用法
  8. kmeans算法中的sse_k-means聚类算法原理与参数调优详解
  9. 【快速乘与快速幂例题讲解】相乘取余爆long long?试试快速乘吧!
  10. Rog14 Win10系统迁移新的三星固态硬盘
  11. linux分区卡住,紧张!正在安ubuntu9.10,分区卡住!
  12. IT行业十大热门职位
  13. 《利用python进行数据分析》第二版 第13章-Python建模库介 学习笔记
  14. atof(),atoi(),itoa(),sprintf()等用法总结
  15. 超实数与单子(Monad)
  16. iPhone游戏编程实例:分享成功游戏开发人员的锦囊妙计
  17. Html5禁止浏览器后退,多页面网站禁用浏览器后退键
  18. python音频 降噪_Python | 简单的扩音,音频去噪,静音剪切
  19. Learning TypeScript 0x3 面向对象编程
  20. Mybatis提取BigDecimal字段值显示丢失末尾0精度的问题解决

热门文章

  1. OpenCV4机器学习(一):OpenCV4+VS2017环境搭建与配置
  2. 推荐一款使用快捷的免费文字识别OCR(图片转文字)在线服务
  3. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
  4. ERP生产线管理系统 with WAMP
  5. 【118期分享】简约商务PPT模板免费下载
  6. 用MUI花两天时间快速开发『One·一个』App,兼容Android、iOS双平台
  7. 日本老人租妻女,“共享家庭”能用来抵抗孤独吗?
  8. 立足于软硬“解耦”的软件定义网络
  9. 390计算机毕业设计
  10. c预言plc编程语言,【讨论】对于PLC的编程语言STL、LAD、SCL等,你用的哪种语言呢?...