通俗易懂!2025 年真实情况:Spring AOP 配置方式对比(一图看懂谁才是王道)
| 配置方式 | 2025 年真实项目使用率 | 学习/面试价值 | 大白话评价 | 适用场景 |
|---|---|---|---|---|
| 注解 AOP(@Aspect) | 99.999% | ★★★★★ | 现在的绝对王者!爽到飞起 | 所有新项目、大厂、Spring Boot 项目 |
| XML AOP | 0.001% | ★ | 活在博物馆的老古董 | 老项目维护、面试被虐 |
| Schema-based | 几乎绝迹 | ★ | 2008年的潮流 | 没人用了 |
| AspectJ 纯注解 | 极少 | ★★ | 核武器,太重 | 极少数性能极致场景 |
2025 年真实结论(直接背):
新项目 100% 用 @Aspect 注解方式
XML AOP 基本只存在于 2015 年之前的遗留系统
大厂连老项目也在疯狂把 XML 改成注解
1. 注解方式 AOP(2025 王者,全部人都在用)
// 1. 开启 AOP(Spring Boot 默认已开启!可以不写)
@EnableAspectJAutoProxy
@SpringBootApplication
public class Application {}
// 2. 写切面(就这么简单!)
@Aspect
@Component
@Order(1) // 数字越小越先执行
public class LogAspect {
@Pointcut("execution(* com.example.controller..*.*(..))")
public void controller() {}
@Before("controller()")
public void before(JoinPoint jp) {
log.info("请求来了:{}", jp.getSignature());
}
@Around("controller()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.prooceed();
log.info("请求结束,耗时:{}ms", System.currentTimeMillis() - start);
return result;
}
}
2. XML 方式 AOP(老古董,面试可能被虐)
<!-- 1. 开启 AOP -->
<aop:aspectj-autoproxy/>
<!-- 2. 定义一个普通 Bean -->
<bean id="logAspect" class="com.example.aspect.LogAspect"/>
<!-- 3. XML 地狱式配置(没人想写这个) -->
<aop:config>
<aop:aspect id="myAspect" ref="logAspect">
<!-- 定义切点 -->
<aop:pointcut id="controllerPointcut"
expression="execution(* com.example.controller..*.*(..))"/>
<!-- 前置通知 -->
<aop:before pointcut-ref="controllerPointcut" method="before"/>
<!-- 环绕通知 -->
<aop:around pointcut-ref="controllerPointcut" method="around"/>
<!-- 异常通知 -->
<aop:after-throwing pointcut-ref="controllerPointcut"
method="afterThrowing" throwing="ex"/>
</aop:aspect>
</aop:config>
然后你还得写一个普通类(不能用 @Aspect):
public class LogAspect {
public void before(JoinPoint jp) { ... }
public Object around(ProceedingJoinPoint pjp) { ... }
}
面试终极对比表(直接甩给面试官)
| 项目 | 注解方式(@Aspect) | XML 方式 |
|---|---|---|
| 配置量 | 10 行代码 | 50+ 行 XML |
| 可读性 | 一眼看懂 | 看吐了 |
| 维护成本 | 改 Java 就行 | 改两边(Java + XML) |
| 热部署 | 支持 | 基本不支持 |
| IDE 支持 | 智能提示、跳转 | 纯字符串,容易写错 |
| Spring Boot 支持 | 原生支持,默认开启 | 需要手动配一堆 |
| 大厂使用情况 | 100% 使用 | 0% 使用(除非接手10年老项目) |
面试必背的 6 个问题 + 标准答案
- 现在项目还用 XML 配置 AOP 吗?
答:基本不用了!Spring Boot 项目默认用注解方式,XML 方式已经过时,只在极老项目维护时见到。 - @EnableAspectJAutoProxy 作用是什么?
答:开启注解 AOP 支持,让 @Aspect 注解生效。Spring Boot 已经自动开启,可以不写。 - 注解 AOP 和 XML AOP 底层实现一样吗?
答:一样!都是通过 Proxy + CGLIB/JDK 动态代理实现的,只是配置方式不同。 - 为什么大厂都抛弃 XML 配置?
答:代码即配置,类型安全、易维护、支持热部署、IDE 友好。 - @Order 注解在 XML 里怎么实现?
答:用<aop:aspect>标签里的order属性,或者在<aop:advisor>里配置。 - 面试官问你“手写一个 XML 方式的切面”怎么办?
答:先说“现在都用注解了,但 XML 也可以”,然后 30 秒默写上面那堆配置,面试官直接给你加 50 分(因为 99%的人写不出来)。
终极记忆口诀(10秒背会)
“2025 年记住了:
新项目只看 @Aspect,
XML AOP 进博物馆,
大厂见了直接拒,
面试问你就说:现在全用注解!”
背完这篇,
你已经彻底掌握了 Spring AOP 的过去、现在和未来!
下次面试官问“AOP 有几种配置方式”,你直接甩出现代答案 + 顺便秀一下 XML 老古董,
他当场就说:“这小伙子历史和现实都懂,收了!”
冲!大厂在等你!