在 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 容器
&spm=1001.2101.3001.5002&articleId=160102602&d=1&t=3&u=5980a09d27524b35b4ec78f497406488)
1175

被折叠的 条评论
为什么被折叠?



