Spring AOP应用

Spring AOP应用


一、AOP基础概念解析

AOP(Aspect-Oriented Programming,面向切面编程) 是一种通过预编译或运行时动态代理的方式,将横切关注点(如日志、事务、权限控制)与核心业务逻辑解耦的编程范式。与OOP不同,AOP通过"横切"方式将通用功能模块化,提升代码复用性。

核心概念解析

public class LogAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint jp) {
        System.out.println("方法执行前记录日志");
    }
}

此代码通过@Before注解定义了前置通知,实现日志记录功能。


二、Spring AOP核心组件

  1. 切面(Aspect)

    • 封装横切逻辑的模块,通过@Aspect注解声明
    • 示例:日志切面、事务切面
  2. 连接点(JoinPoint)

    • 方法执行、异常抛出等程序执行点
    • 可通过ProceedingJoinPoint获取方法参数
  3. 通知(Advice)类型

    @Before("execution(* com.service.*.*(..))")
    public void beforeAdvice() { ... }
    
    • @Before:前置通知
    • @AfterReturning:返回后通知
    • @Around:环绕通知
  4. 切点表达式

    @Pointcut("execution(* com.service.*.*(..))")
    private void serviceMethods() {}
    

三、Spring AOP实现原理

代理机制对比

  • JDK动态代理:基于接口
  • CGLIB代理:适用于无接口类

执行流程

  1. Bean初始化时生成代理对象
  2. 调用方法时触发拦截器链
  3. 按顺序执行通知逻辑

四、AOP开发实战

事务管理示例

@Transactional
public void transfer(Account from, Account to, double amount) {
    // 转账业务逻辑
}

通过@Transactional注解实现声明式事务。


五、性能优化与最佳实践

  1. 切点表达式优化

    @Pointcut("within(com.service.*) && @annotation(Loggable)")
    private void loggableMethods() {}
    
  2. 执行顺序控制

    @Order(1)
    public class LoggingAspect { ... }
    

六、典型应用场景

场景 实现方案 优势
日志记录 使用@Around记录方法耗时 非侵入式监控
权限校验 @Before进行权限校验 业务解耦
缓存控制 @Cacheable实现缓存 提升系统性能

七、常见问题与解决方案

Q:动态代理失效场景? A:当目标类未实现接口且未启用CGLIB代理时,需配置proxyTargetClass=true

调试技巧

// 查看代理类
System.out.println(target.getClass().getName());

八、性能优化建议

  1. 精确限定切点表达式范围
  2. 避免在切面中执行耗时操作
  3. 合理配置@Order控制切面顺序

思考题:如何实现方法级别的自定义注解权限控制?


正文到此结束
评论插件初始化中...
Loading...