Spring Boot AOP 不生效?一文讲透排查思路(多模块实战)

在 Spring Boot 多模块(微服务)架构中,经常会遇到一个经典问题:

❗ 注解已经加了,但 AOP 不生效,切面方法完全不执行

本文结合实际问题(BusinessLogAspect 不生效),总结一套可复用的排查方法论。

一、问题现象

典型表现:

Controller 方法上已添加自定义注解
AOP 切面已编写(@Aspect + @Around)
但切面中的日志/逻辑完全不执行
debug/日志完全不打印

例如:

@BusinessLog(...)
public R<?> update(...) { }

但:

log.info("BusinessLogAspect====="); // 没打印

二、AOP 生效的三大前提(核心)

Spring AOP 要生效,必须同时满足:

✅ 1. 切面是 Spring Bean

必须满足之一:

@Component
@Bean
@Configuration + @Bean

自动装配(starter)
✅ 2. 类被 Spring 容器管理

目标类必须是:

Controller / Service / Bean
✅ 3. 方法通过代理对象调用

必须是:

外部调用(通过 Spring 代理)

不能是:

this.method() ❌(自调用失效)

三、完整排查流程(建议收藏)

🥇 Step 1:确认切面是否被加载(最关键)

在 AOP 类中加:

@PostConstruct
public void init() {
    log.info("AOP已加载:BusinessLogAspect");
}

👉 如果没打印:

✔ 说明:Bean根本没注册

🥈 Step 2:确认 Spring 是否扫描到该 Bean

检查:

✔ 启动类扫描范围

@SpringBootApplication(scanBasePackages = "com.loctek")

❗ 常见问题
启动类在 com.loctek.marketing
但 AOP 在 com.loctek.common
→ 默认不会扫描
🥉 Step 3:确认 Bean 注册方式

Spring Bean 有三种来源:

方式 是否需要扫描
@Component 需要
@Bean 不需要
AutoConfiguration 不需要
👉 关键对比(本案例核心原因)
AOP类 注册方式 是否生效
OperateLogAspect @Bean 手动注册 ✅ 生效
BusinessLogAspect @Component 未扫描 ❌ 不生效
🧪 Step 4:验证 Bean 是否存在

@Autowired
ApplicationContext ctx;

@PostConstruct
public void test() {
    System.out.println(ctx.getBeanNamesForType(BusinessLogAspect.class).length);
}

结果:

0 = 未注册 ❌
1 = 已注册 ✅
⚙️ Step 5:确认 AOP 是否开启

一般 Spring Boot 默认已开启,但可以验证:

@EnableAspectJAutoProxy

//或检查:

spring-boot-starter-aop

⚠️ Step 6:检查是否自调用(高级坑)

this.updateMethod();

AOP 不生效

四、本次问题根因总结

本次问题本质是:

❗ Spring Boot 并没有扫描 common 模块的 @Component

而:

OperateLogAspect = @Bean 注册 → 生效
BusinessLogAspect = @Component 未扫描 → 不生效

🚀 五、最终解决方案(推荐)
🥇 方案1:统一改为 @Bean 注册(最快)

@Bean
public BusinessLogAspect businessLogAspect() {
    return new BusinessLogAspect();
}

🥈 方案2:开启组件扫描(推荐)

@SpringBootApplication(scanBasePackages = "com.loctek")

🥉 方案3:做成 Starter(最佳实践)

common-log-starter

自动装配:

@Configuration
@ComponentScan
AutoConfiguration.imports

📌 六、最佳实践总结(可复用)

以后遇到 AOP 不生效,按这个顺序排查:

✅ 1. 切面是否加载(@PostConstruct)
✅ 2. 是否是 Spring Bean
✅ 3. 是否被扫描(scanBasePackages)
✅ 4. 是否通过代理调用
✅ 5. 是否存在 @Bean / @Component 冲突
✅ 6. 是否 AOP 开启
💡 七、一句话经验总结(精华)

AOP 不生效,90% 不是 AOP 问题,而是 Bean 没进 Spring 容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值