在开发和调试过程中,确认一个方法是否被 AOP 成功增强。有多种方法可以做到这一点,从简单直接到高级专业。
方法一:在代码中打印对象的类名 (最简单直接)
这是最快、最简单的方法,可以让你立即知道一个 Bean 是否被代理了。
-
原理:如果一个对象被 AOP 增强,Spring 容器注入给你的就不是原始对象,而是一个代理对象。这个代理对象的类名会很特殊。
- CGLIB 代理: 类名会包含
$$EnhancerBySpringCGLIB$$或类似的字样。 - JDK 动态代理: 类名会是类似
com.sun.proxy.$ProxyXX的形式。
- CGLIB 代理: 类名会包含
-
如何操作:
在你想要检查的 Bean 被注入的地方(比如一个 Controller、Test 类或CommandLineRunner),打印出这个对象的getClass().getName()。 -
示例:
假设我们有一个OrderService。@RestController public class MyController { @Autowired private OrderService orderService; @PostConstruct public void checkAop() { System.out.println("OrderService 的真实类型是: " + orderService.getClass().getName()); } }可能的输出:
- 如果 AOP 生效了:
OrderService 的真实类型是: com.example.service.OrderService$$EnhancerBySpringCGLIB$$a1b2c3d4 - 如果 AOP 没有生效:
OrderService 的真实类型是: com.example.service.OrderService
只要类名不是你原始的类名,就说明 AOP 已经为它创建了代理。
- 如果 AOP 生效了:
方法二:使用 IDE 的 AOP 提示功能 (最高效)
如果你使用的是 IntelliJ IDEA Ultimate 版本,它提供了强大的 AOP 支持,这是日常开发中最高效的方式。
-
原理: IDE 会静态分析你的代码,识别出切面和切点,然后在源代码编辑器中直接给你提示。
-
如何操作:
观察方法声明的左侧“行号栏”(Gutter)。- 如果一个方法被 AOP 增强了,它的左侧会出现一个绿色的、类似“回旋”或“织入”图标。
- 你将鼠标悬停在这个图标上,它会提示你“Advised by…”(被…增强)。
- 点击这个图标,IDE 会弹出一个列表,清晰地列出所有应用到这个方法上的通知 (Advice),你甚至可以点击直接跳转到对应的切面代码。
这个功能让你一目了然,无需运行代码。
方法三:查看堆栈跟踪 (Debugging 时常用)
当你正在调试代码,或者程序抛出了一个异常时,查看堆栈跟踪信息是判断 AOP 是否存在的绝佳方式。
-
原理: 由于 AOP 是通过代理和调用链实现的,所以一个被代理的方法,其调用堆栈会比普通方法长得多,并且包含很多 AOP 相关的类。
-
如何操作:
- 在你的方法上打一个断点,然后 Debug 运行。
- 当断点命中时,查看 Debugger 窗口中的调用堆栈 (Call Stack)。
- 或者,故意在方法里抛出一个异常
throw new RuntimeException("Debug AOP");,然后观察控制台打印的异常堆栈。
-
寻找关键类名:
在堆栈信息中寻找以下这些类名,只要看到它们,就说明 AOP 正在工作:...CglibAopProxy$DynamicAdvisedInterceptor.intercept(...)...JdkDynamicAopProxy.invoke(...)...ReflectiveMethodInvocation.proceed()...Proxy......EnhancerBy...
方法四:静态代码分析 (源头追溯)
这种方法需要你对项目代码有一定的了解。
-
检查方法本身: 查看你关心的方法上,是否直接或间接地被一些触发 AOP 的注解标记,例如:
@Transactional(事务)@Cacheable(缓存)@Async(异步)@Secured/@PreAuthorize(安全)- 任何你自定义的、被
@Aspect拦截的注解。
-
检查全局切面: 在你的项目中搜索
@Aspect注解,找到所有的切面类。 -
检查切点表达式: 查看这些切面类中的
@Pointcut表达式 (execution(...),within(...),@annotation(...)等),判断它们的匹配规则是否覆盖了你所关心的方法。
方法五:使用专业的诊断工具 (高级/生产环境)
对于更复杂的场景,或者在生产环境中排查问题时,可以使用专业的 Java 诊断工具。
- Arthas: 阿里巴巴开源的 Java 诊断神器。
- 命令:
sc -d com.example.service.OrderService(sc是 search-class,-d是查看详情)。 - 输出: 这个命令会打印出这个类的详细信息,包括它的类加载器、父类、实现的接口等。如果是代理类,你会清晰地看到它的类名是 CGLIB 生成的,并且
codeSource会指向一个内存中的动态位置。
- 命令:
总结
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 打印类名 | 简单、快速、直观 | 需要修改代码并运行 | 快速验证、简单调试 |
| IDE 提示 | 最高效、最直观、无需运行 | 依赖特定 IDE (IntelliJ Ultimate) | 日常开发首选 |
| 查看堆栈 | 无需改代码,信息详细 | 需要调试或有异常抛出 | Debugging、异常排查 |
| 静态分析 | 从根本上理解原因 | 需要熟悉代码和 AOP 规则 | 代码审查、问题根源分析 |
| 诊断工具 | 功能强大,适用于生产环境 | 需要学习工具的使用 | 生产环境问题排查、深度分析 |
1713

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



