aop:config是spring xml中声明式AOP的顶层配置标签,用于定义切面、切入点和通知,需引入AOP相关jar并声明aop命名空间,其子标签包括pointcut、aspect等,现多被@Aspect注解取代。

什么是 aop:config
aop:config 是 Spring XML 配置中用于声明式 AOP 的顶层标签,它告诉 Spring 容器:接下来要定义切面(Aspect)、切入点(Pointcut)、通知(Advice)等 AOP 元素。它本身不执行任何逻辑,只是启用基于 XML 的 AOP 配置模式,并提供命名空间支持。
如何在 Spring XML 中启用并使用 aop:config
必须先确保 Spring AOP 相关 jar(如 spring-aop、aspectjweaver)已引入,且 XML 中正确声明了 aop 命名空间:
-
必须包裹所有、等子元素 -
ref指向的切面 bean(如loggingAspect)必须是普通 Spring bean,不能是代理对象 - 表达式中的包路径需真实存在,否则运行时不会报错但切面不生效
- Spring 默认只代理接口(JDK proxy),若目标类无接口,需开启
启用 CGLIB
aop:config 下常见子标签与作用
实际配置中主要靠以下组合完成切面逻辑:
-
:定义匹配规则,id供其他地方引用;expression支持execution、within、@annotation等 -
:绑定一个 bean 实例作为切面,内部可嵌套多种通知 - 通知类型必须对应切面类中同名、无参、返回 void 的方法:
、、、、 -
方法签名必须为Object methodName(ProceedingJoinPoint pjp),且必须调用pjp.proceed(),否则目标方法不执行
为什么现在很少用 aop:config?容易踩哪些坑?
XML 方式配置 AOP 已基本被 @Aspect 注解取代,主要原因包括:
- 表达式写错时无编译检查,只有运行时才失效,调试困难
- 无法利用 ide 自动补全和跳转,
method属性值写错也不会报错 - 切面类中若方法有参数(如想获取入参),XML 无法传递,只能靠
JoinPoint手动取,且必须声明为第一个参数——但 XML 根本不校验这点 -
和混用时,重复扫描可能造成切面被注册两次 - spring boot 默认禁用 XML 配置,
aop:config在spring-boot-starter-aop下仍可用,但需手动加载 XML,不符合约定优于配置原则
如果项目遗留 XML 配置必须维护,重点关注 pointcut 表达式是否真能匹配到目标方法,以及切面 bean 是否被正确实例化——这两点出问题,切面会静默失效,最难排查。