aop:config是什么 如何在Spring XML中配置切面

14次阅读

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

aop:config是什么 如何在Spring XML中配置切面

什么是 aop:config

aop:config 是 Spring XML 配置中用于声明式 AOP 的顶层标签,它告诉 Spring 容器:接下来要定义切面(Aspect)、切入点(Pointcut)、通知(Advice)等 AOP 元素。它本身不执行任何逻辑,只是启用基于 XML 的 AOP 配置模式,并提供命名空间支持。

如何在 Spring XML 中启用并使用 aop:config

必须先确保 Spring AOP 相关 jar(如 spring-aopaspectjweaver)已引入,且 XML 中正确声明了 aop 命名空间:

  

  • 必须包裹所有 等子元素
  • ref 指向的切面 bean(如 loggingAspect)必须是普通 Spring bean,不能是代理对象
  • 表达式中的包路径需真实存在,否则运行时不会报错但切面不生效
  • Spring 默认只代理接口(JDK proxy),若目标类无接口,需开启 启用 CGLIB

aop:config 下常见子标签与作用

实际配置中主要靠以下组合完成切面逻辑:

  • :定义匹配规则,id 供其他地方引用;expression 支持 executionwithin@annotation
  • :绑定一个 bean 实例作为切面,内部可嵌套多种通知
  • 通知类型必须对应切面类中同名、无参、返回 void 的方法:
  • 方法签名必须为 Object methodName(ProceedingJoinPoint pjp),且必须调用 pjp.proceed(),否则目标方法不执行

为什么现在很少用 aop:config?容易踩哪些坑?

XML 方式配置 AOP 已基本被 @Aspect 注解取代,主要原因包括:

  • 表达式写错时无编译检查,只有运行时才失效,调试困难
  • 无法利用 ide 自动补全和跳转,method 属性值写错也不会报错
  • 切面类中若方法有参数(如想获取入参),XML 无法传递,只能靠 JoinPoint 手动取,且必须声明为第一个参数——但 XML 根本不校验这点
  • 混用时,重复扫描可能造成切面被注册两次
  • spring boot 默认禁用 XML 配置,aop:configspring-boot-starter-aop 下仍可用,但需手动加载 XML,不符合约定优于配置原则

如果项目遗留 XML 配置必须维护,重点关注 pointcut 表达式是否真能匹配到目标方法,以及切面 bean 是否被正确实例化——这两点出问题,切面会静默失效,最难排查。

text=ZqhQzanResources