Java 切面(AOP)与注解总结

1. 什么是切面(Aspect)

切面是 AOP(面向切面编程) 的核心,用于封装跨越多个业务方法的公共逻辑,例如:

  • 日志记录(logging)
  • 权限校验(authorization)
  • 事务管理(transaction)
  • 异常处理(exception handling)
  • 性能监控(monitoring)

这些逻辑本身 不属于业务核心,但会散落在很多地方,因此需要通过 AOP 抽取到一个独立模块,即 切面


2. AOP 的核心概念

概念 说明
切面(Aspect) 封装横切逻辑的类
通知(Advice) 逻辑执行的时间点,如前置、后置、异常、环绕
切点(Pointcut) 定义拦截哪些方法
连接点(JoinPoint) 方法执行的某个时机
织入(Weaving) 将切面逻辑注入业务代码的过程

3. 常见通知类型(Advice)

  • @Before:方法执行前
  • @After:方法执行后(不管是否异常)
  • @AfterReturning:方法成功返回后
  • @AfterThrowing:方法抛异常时
  • @Around:最强大,可控制方法执行前后、甚至阻断、修改返回值

4. 注解与切面的关系

注解 ≠ 切面

但:注解常用于触发切面逻辑

注解作用

  • 注解是“标记”
  • 告诉 AOP:这个方法要启用对应切面逻辑

切面作用

  • 切面是“逻辑”
  • 用来实现注解背后的功能

5. 注解如何触发切面逻辑(示例)

自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogOperation {
    String value() default "";
}

编写切面

@Aspect
@Component
public class LogAspect {

    @Before("@annotation(com.sky.annotation.LogOperation)")
    public void recordLog() {
        System.out.println("执行日志记录");
    }
}

在业务方法使用注解

@LogOperation("新增分类")
public void addCategory() {}

AOP 会自动在方法执行前触发切面逻辑。


6. 为什么注解常和切面一起使用?

  • 可读性强,不需要复杂的 execution 表达式
  • 灵活,只需在方法上加注解即可
  • 非侵入式,无需修改业务逻辑
  • 大量 Spring 功能也基于 “注解 + AOP”:
    • @Transactional
    • @Async
    • @Cacheable
    • @Validated

7. 总结一句话

注解是切面的入口,切面是注解背后的逻辑。
注解 = “标记方法”
切面 = “发现标记后执行的逻辑”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐