手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • peter
    Spring与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
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部