博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。
② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。
③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。
进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。
群公告里还有全网大赛约稿汇总/博客提效工具集/CSDN自动化运营脚本 有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

img


Spring Boot AOP(五) 高级特性与源码实践

1. 高级特性概述

在企业项目中,除了基础的注解切面,Spring AOP 还提供以下高级特性:

  • 自定义 Advisor:控制通知和切入点组合
  • 自定义 Pointcut:精确匹配方法
  • 自定义 Advice:实现特定逻辑,如限流、熔断、缓存
  • 自动代理装配流程:Spring 自动生成代理对象,织入切面
  • 多切面组合优化:控制顺序、重复切面处理

2. 自定义 Pointcut

Pointcut 决定哪些方法需要被切面处理。Spring 提供 StaticMethodMatcherPointcutDynamicMethodMatcherPointcut 供开发者自定义。

public class MyPointcut extends StaticMethodMatcherPointcut {

    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        return method.getName().startsWith("get");
    }
}
  • 匹配所有以 get 开头的方法
  • 可以结合自定义 Advisor 使用

Mermaid 图:自定义 Pointcut 匹配流程

匹配

不匹配

扫描 Bean 方法

匹配自定义 Pointcut

应用 Advice

直接调用方法

方法执行 + 通知逻辑


3. 自定义 Advice

Advice 可以实现任意逻辑,只要实现 MethodInterceptor 接口即可。

public class MyAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("自定义通知前逻辑");
        Object result = invocation.proceed();
        System.out.println("自定义通知后逻辑");
        return result;
    }
}
  • 结合自定义 Pointcut,可以形成 自定义 Advisor
  • 实现灵活的业务逻辑切面,例如限流、缓存、监控

4. 自定义 Advisor

Advisor 是 切入点 + 通知的组合。可以用 DefaultPointcutAdvisor 将自定义 Pointcut 和 Advice 绑定。

Pointcut pointcut = new MyPointcut();
Advice advice = new MyAdvice();
Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
  • Advisor 可以加入到 ProxyFactory 生成代理对象
  • 支持排序,控制执行顺序

Mermaid 图:自定义 Advisor 执行流程

匹配

不匹配

方法调用

匹配自定义 Pointcut

调用自定义 Advice

执行目标方法

返回结果


5. 自动代理装配流程

Spring 自动将切面应用到 Bean 的核心流程:

  1. 扫描 Bean 定义,找到带 @Aspect 的类
  2. 将切面解析为 Advisor 列表
  3. 在 Bean 初始化后,判断是否需要代理
  4. 使用 ProxyFactoryCGLIB Enhancer 创建代理
  5. 将代理对象替换原 Bean 注入容器

Mermaid 图:自动代理装配流程

BeanDefinition 注册

实例化 Bean

依赖注入

postProcessBeforeInitialization

初始化方法

postProcessAfterInitialization

是否匹配切面?

创建 ProxyFactory

选择代理类型 JDK/CGLIB

生成代理对象

替换原 Bean 注入容器

直接返回 Bean


6. 高级实战示例:统一限流切面

@Aspect
@Component
public class RateLimitAspect {

    private final Map<String, AtomicInteger> counter = new ConcurrentHashMap<>();

    @Around("@annotation(rateLimit)")
    public Object limit(ProceedingJoinPoint pjp, RateLimit rateLimit) throws Throwable {
        String key = pjp.getSignature().toShortString();
        counter.putIfAbsent(key, new AtomicInteger(0));

        if (counter.get(key).incrementAndGet() > rateLimit.value()) {
            throw new RuntimeException("限流触发: " + key);
        }

        try {
            return pjp.proceed();
        } finally {
            counter.get(key).decrementAndGet();
        }
    }
}
  • 利用自定义切面控制方法调用次数
  • 可以与事务、日志切面组合使用

Mermaid 图:限流切面执行链

未超限

超限

方法调用

RateLimitAspect 环绕通知前逻辑

检查调用次数

执行目标方法

抛出异常

环绕通知后逻辑

返回调用方


7. 多 Advisor + 自动代理组合

  • 自动扫描多个 @Aspect
  • 将所有 Advisor 按顺序加入 ProxyFactory
  • 调用链统一管理 MethodInterceptor,支持环绕、前置、后置、异常通知

客户端调用

LoggingAspect @Before

TransactionAspect @Around 前

RateLimitAspect @Around 前

目标方法执行

RateLimitAspect @Around 后

TransactionAspect @Around 后提交/回滚

LoggingAspect @AfterReturning

返回客户端


8. 小结

  • Spring AOP 高级特性允许 自定义 Advisor、Pointcut、Advice,实现复杂业务切面
  • 自动代理装配由 AnnotationAwareAspectJAutoProxyCreator + ProxyFactory 完成
  • 多切面组合执行顺序由 @OrderOrdered 接口控制
  • Mermaid 流程图清晰展示了自定义切面 + 自动代理 + 多通知组合执行链
  • 这些高级特性在企业项目中用于 统一日志、限流、缓存、事务控制,保持代码整洁与可维护性

结束语


👨‍💻 关于我

持续学习 | 追求真我

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

感谢订阅专栏 三连文章

image-20251011155556997

掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner

专栏 简介
📊 一图读懂系列 图文并茂,轻松理解复杂概念
📝 一文读懂系列 深入浅出,全面解析技术要点
🌟持续更新 保持学习,不断进步
🎯 人生经验 经验分享,共同成长

你好,我是Qiuner. 为帮助别人少走弯路而写博客

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.

上一篇推荐 链接
Java程序员快又扎实的学习路线 点击该处自动跳转查看哦
一文读懂 AI 点击该处自动跳转查看哦
一文读懂 服务器 点击该处自动跳转查看哦
2024年创作回顾 点击该处自动跳转查看哦
一文读懂 ESLint配置 点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑 点击该处自动跳转查看哦
未来会写什么文章? 预告链接
一文读懂 XX? 点击该处自动跳转查看哦
2025年终总结 点击该处自动跳转查看哦
一图读懂 XX? 点击该处自动跳转查看哦

img

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐