在 Spring 中,@Aspect 切面需配合 @Component 被容器管理并启用 AOP 支持,切点默认仅匹配 public 方法,避免自调用失效和代理限制,可通过 @Order 指定执行优先级。

在 Spring 中,使用 @Aspect 声明一个独立的切面组件,核心是让该类被 Spring 容器识别为切面,并配合 @Pointcut、@Before、@Around 等通知注解定义增强逻辑。关键在于:类必须是 Spring 管理的 Bean,且需启用 AOP 支持。
确保项目已启用 Spring AOP
Spring Boot 项目默认已引入 spring-boot-starter-aop,无需额外配置;若为传统 Spring(XML 或 Java Config),需确认已启用 AOP:
- Java 配置中添加
@EnableAspectJAutoProxy - XML 配置中启用
<aspectj-autoproxy></aspectj-autoproxy>
定义切面类并标注 @Aspect 和 @Component
@Aspect 本身不是 Spring 的 Bean 注解,必须搭配 @Component(或其派生注解如 @Service)才能被组件扫描识别:
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service..*.*(..))")
public void serviceMethods() {}
<pre class="brush:php;toolbar:false;">@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("【前置】调用方法:" + joinPoint.getSignature().toShortString());
}}
注意:@Aspect 类不能是 final 的,也不能使用 Lambda 表达式定义内部类切面。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
避免常见陷阱
以下情况会导致切面不生效:
- 切面类未加
@Component或未被@ComponentScan扫描到 - 目标方法被同类内其他方法直接调用(绕过代理,即“自调用失效”)
- 切点表达式匹配不到实际执行的方法(如包路径错误、访问修饰符限制,默认只拦截 public 方法)
- 使用了 CGLIB 代理但目标类没有无参构造函数,或使用 JDK 动态代理但目标类没实现接口
可选:指定切面优先级
多个切面执行顺序不确定时,可用 @Order 或实现 Ordered 接口控制优先级(数值越小优先级越高):
@Aspect
@Component
@Order(1)
public class TransactionAspect { ... }
若未指定,顺序由 Spring 容器中 Bean 的注册顺序决定,不保证稳定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










