java中可通过spring aop在方法前后统一处理日志、权限等横切关注点,需定义@aspect切面类、启用@enableaspectjautoproxy、使用@before/@after/@around等通知及自定义注解切点,注意代理机制与线程上下文传递。

Java 中可以通过 Spring AOP(面向切面编程)在方法执行前后统一处理日志记录、权限校验等横切关注点,无需侵入业务代码。
使用 @Aspect 定义切面类
创建一个被 @Aspect 和 @Component 注解的类,Spring 会将其识别为切面:
- 必须启用 AOP 支持(
@EnableAspectJAutoProxy或 XML 配置) - 切面类需由 Spring 容器管理(如加
@Component) - 切点表达式(
@Pointcut)可复用,提高可读性
用 @Before/@After/@Around 织入逻辑
根据执行时机选择通知类型:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@Before("execution(* com.example.service..*.*(..))"):方法执行前做权限校验,校验失败可抛异常中断流程 -
@AfterReturning(pointcut = "serviceMethods()", returning = "result"):成功返回后记录日志或埋点 -
@Around("serviceMethods()"):最灵活,可控制是否执行原方法、修改参数/返回值,适合耗时统计或事务包装
结合注解实现更精准的切点
自定义注解 + 切点表达式,让增强逻辑只作用于标记的方法:
- 定义注解
@LogExecutionTime或@RequireRole("ADMIN") - 切点写成
@Pointcut("@annotation(com.example.annotation.LogExecutionTime)") - 业务方法上加注解即可触发对应切面,解耦清晰、语义明确
注意线程与代理限制
AOP 默认基于 JDK 动态代理(接口)或 CGLIB(类),需留意:
- 同一类中方法内部调用(this.xxx())不会触发切面,需通过代理对象调用
- @Around 中获取目标方法参数建议用
joinPoint.getArgs(),而非硬编码 - 若涉及 ThreadLocal(如用户上下文),确保在环绕通知中正确传递,避免子线程丢失
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










