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

19|Pointcut :如何批量匹配代理方法?

你好,我是郭屹。今天我们继续手写 MiniSpring。
到目前为止,我们已经初步实现了简单的 AOP,做到了封装 JDK 的动态代理,并且定义了 Advice,实现了调用前、调用时、调用后三个不同位置对代理对象进行增强的效果,而这些切面的定义也是配置在外部文件中的。我们现在在这个基础之上继续前进,引入 Pointcut 这个概念,批量匹配需要代理的方法。

引入 Pointcut

我们再回头看一下代码,前面所有的代理方法,都是同一个名字——doAction。我们用以下代码将该方法名写死了,也就是说我们只认定这一个方法名为代理方法,而且名字是不能改的。
if (method.getName().equals("doAction")) {
}
如果我们需要增加代理方法,或者就算不增加,只是觉得这个方法名不好想换一个,怎么办呢?当前这种方法自然不能满足我们的需求了。而这种对多个方法的代理需求又特别重要,因为业务上有可能会想对某一类方法进行增强,统一加上监控日志什么的,这种情况下,如果要逐个指定方法名就太麻烦了。
进一步考虑,即便我们这里可以支持多个方法名,但是匹配条件仍然是 equals,也就是说,规则仅仅是按照方法名精确匹配的,这样做太不灵活了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

AOP框架中的Pointcut概念及其应用是本文的重点。文章首先指出了目前代理方法匹配的局限性,即只能通过方法名精确匹配,不够灵活。随后,详细介绍了如何使用Pointcut来支持多个代理方法的匹配,通过配置文件定义匹配规则,实现了对方法名的通配匹配。文章还讲解了MethodMatcher、Pointcut和PointcutAdvisor三个接口的定义,以及NameMatchMethodPointcut和NameMatchMethodPointcutAdvisor的实现。通过代码示例展示了如何使用PatternMatchUtils工具类进行字符串匹配,以及NameMatchMethodPointcutAdvisor的实现细节。整体而言,本文深入浅出地介绍了AOP框架中Pointcut的应用,为读者提供了清晰的技术指导。文章还提到了相关类的改造和测试,以及对Join Point、Advice、Advisor、Interceptor和Pointcut等概念的梳理。这篇文章对AOP框架中Pointcut的应用进行了全面而深入的介绍,对于想要深入了解AOP框架的读者来说,是一篇非常有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 不是早晨,就是黄昏
    能不能说明以下Advice接口和Advisor接口之间的关系,更进一步的是设计上的关系。

    作者回复: advice是真正的要动态插入的业务增强逻辑。advisor则是一个管理类,它包了一个advice,还能寻找到符合条件的方法名进行增强。

    2023-04-24归属地:河南
    1
  • 青莲
    每个匹配模式都可以实现PointcutAdvisor接口,尊循单一职责,如果要同时支持几种能力,可以考虑拐出一个管理类组合几种接口使用

    作者回复: 赞

    2023-05-05归属地:浙江
  • 欧阳利
    为什么Interceptor需要实现Advice接口

    作者回复: 因为需要把interceptor, beforeadvice和afteradvice几种统一处理

    2023-04-30归属地:广东
  • Ben Guo
    1. NameMatchMethodPointcut的getMethodMatcher()应该返回 this,而不是null; 2. JdkDynamicAopProxy的invoke方法,如果方法名不是mappedName匹配,应该要执行method.invoke()。 示例及源码中均返回null,导致该方法没有被执行。
    2023-08-17归属地:广东
    1
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部