17|动态代理:如何在运行时插入逻辑?
郭屹
你好,我是郭屹。今天我们继续手写 MiniSpring。
从这节课开始,我们就要进入 AOP 环节了。在学习之前,我们先来了解一下是 AOP 怎么回事。
AOP,就是面向切面编程(Aspect Orient Programming),这是一种思想,也是对 OOP 面向对象编程的一种补充。你可能会想:既然已经存在 OOP 面向对象编程了,为什么还需要 AOP 面向切面编程呢?
这是因为在许多场景下,一个类的方法中,除了业务逻辑,通常还会包括其他比较重要但又不算主业务逻辑的例行性逻辑代码,比如常见的日志功能,它不影响我们的主业务逻辑,但又能在必要时定位问题,几乎每一个业务方法中都需要。又比如权限检查、事务处理,还有性能监控等等,都是这种情况。
显而易见,日志这类例行性逻辑,在任何一个业务方法实现中都是需要的。如果简单地将这些代码写在业务方法中,会出现两个后果,第一,我们就会将日志之类的代码重复地编写多次;第二,一个业务方法中会包含很多行例行代码,去看源代码会发现方法中多数语句不是在做业务处理。
有专业进取心的程序员就会思考一个问题,有没有办法将这些例行性逻辑单独抽取出来,然后在程序运行的时候动态插入到业务逻辑中呢?正是因为这个疑问,AOP 应运而生了。这个问题听起来似乎无解,程序在运行时改变程序本身,似乎有点不可思议。我们研究一下 Java,就会惊奇地发现,Java 里面早就给我们提供了一个手段:动态代理。我们可以利用它来开展我们的工作。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Java中动态代理的应用,通过讲解AOP的概念和代理模式的原理,详细阐述了动态代理的实现方式及其在运行时对接口进行代理的效果。文章强调了动态代理相对于静态代理的灵活性和侵入性较低的特点,通过具体的代码示例帮助读者理解动态代理的原理和实现方式。此外,还提到了Spring中的代理支持JDK代理与Cglib代理两种,以及AOP的别的实现方案AspectJ。文章内容详实,对于想要深入了解动态代理的读者具有很高的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》,新⼈⾸单¥59
《手把手带你写一个 MiniSpring》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- peterSpring与AspectJ是什么关系?AspectJ是一个独立的工具软件,Spring使用该软件完成AOP,这样理解对吗?
作者回复: 对。跟jdk的动态代理等位的一个实现。
2023-04-20归属地:北京1 - 风轻扬可以在DefaultAopProxyFactory类中,获取AopProxy时改造。新增一个入参,区分是jdk的接口代理还是cglib代理,进而返回不同的代理
作者回复: 后面有参考回答。
2023-05-29归属地:北京 - 不是早晨,就是黄昏DynamicProxy proxy = new DynamicProxy(action); IAction p = (IAction)proxy.getProxy(); action.doAction(); 这里是不是要写成p.doAction();
作者回复: 是的是的,后面改过来。这是线下班的时候一边演示一边跟学生说这个地方最后应该是action.doAction顺手就改了。Github上是正确的。
2023-04-19归属地:河南2
收起评论