Spring 基于注解与XML的AOP配置

通俗易懂!2025 年真实情况:Spring AOP 配置方式对比(一图看懂谁才是王道)

配置方式2025 年真实项目使用率学习/面试价值大白话评价适用场景
注解 AOP(@Aspect)99.999%★★★★★现在的绝对王者!爽到飞起所有新项目、大厂、Spring Boot 项目
XML AOP0.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 个问题 + 标准答案

  1. 现在项目还用 XML 配置 AOP 吗?
    答:基本不用了!Spring Boot 项目默认用注解方式,XML 方式已经过时,只在极老项目维护时见到。
  2. @EnableAspectJAutoProxy 作用是什么?
    答:开启注解 AOP 支持,让 @Aspect 注解生效。Spring Boot 已经自动开启,可以不写。
  3. 注解 AOP 和 XML AOP 底层实现一样吗?
    答:一样!都是通过 Proxy + CGLIB/JDK 动态代理实现的,只是配置方式不同。
  4. 为什么大厂都抛弃 XML 配置?
    答:代码即配置,类型安全、易维护、支持热部署、IDE 友好。
  5. @Order 注解在 XML 里怎么实现?
    答:用 <aop:aspect> 标签里的 order 属性,或者在 <aop:advisor> 里配置。
  6. 面试官问你“手写一个 XML 方式的切面”怎么办?
    答:先说“现在都用注解了,但 XML 也可以”,然后 30 秒默写上面那堆配置,面试官直接给你加 50 分(因为 99%的人写不出来)。

终极记忆口诀(10秒背会)

“2025 年记住了:
新项目只看 @Aspect,
XML AOP 进博物馆,
大厂见了直接拒,
面试问你就说:现在全用注解!”

背完这篇,
你已经彻底掌握了 Spring AOP 的过去、现在和未来!
下次面试官问“AOP 有几种配置方式”,你直接甩出现代答案 + 顺便秀一下 XML 老古董,
他当场就说:“这小伙子历史和现实都懂,收了!”
冲!大厂在等你!

文章已创建 3958

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部