基于XML Schema方式的切面实现是Spring AOP中通过XML配置定义切面、切点及通知(Advice)的传统方式,其核心是通过Spring的AOP命名空间标签将普通Java类声明为切面,实现横切关注点的集中管理。以下是关键实现要点:
1. 核心配置结构
-
命名空间引入:需在XML配置文件中添加AOP命名空间约束(
xmlns:aop
)及Schema地址。<beans xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="...spring-aop.xsd">
-
切面配置标签:
<aop:config>
:根标签,包裹所有AOP配置。<aop:aspect>
:定义切面,通过ref
属性关联切面类Bean。<aop:pointcut>
:声明切点表达式(如execution(* com.example.*.*(..))
)。
2. 通知类型与标签
Spring提供五种通知类型,对应XML标签如下:
通知类型 | XML标签 | 执行时机 |
---|---|---|
前置通知(Before) | <aop:before> | 目标方法执行前 |
后置通知(After) | <aop:after-returning> | 目标方法正常返回后 |
异常通知(After Throwing) | <aop:after-throwing> | 目标方法抛出异常时 |
最终通知(After) | <aop:after> | 目标方法结束后(无论是否异常) |
环绕通知(Around) | <aop:around> | 包裹目标方法,需手动调用proceed() |
3. 实现流程示例
-
定义切面类:普通Java类包含通知方法(无需注解)。
public class LoggingAspect { public void logBefore() { ... } // 前置通知方法 }
-
XML配置切面:
<bean id="loggingAspect" class="com.example.LoggingAspect"/> <aop:config> <aop:aspect ref="loggingAspect"> <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/> <aop:before pointcut-ref="serviceMethods" method="logBefore"/> </aop:aspect> </aop:config>
其中
expression
使用AspectJ切点表达式语法。
4. 优势与适用场景
- 优势:
- 解耦:切面逻辑与业务代码分离,通过配置动态调整。
- 兼容性:适用于无注解或需兼容旧系统的项目。
- 适用场景:日志记录、事务管理、权限检查等横切关注点。
对比注解方式
特性 | XML Schema方式 | 注解方式(如@Aspect) |
---|---|---|
配置形式 | 集中式XML配置 | 分散在切面类中 |
灵活性 | 修改需重启容器 | 动态调整(结合Spring代理) |
代码侵入性 | 无侵入(纯POJO) | 需添加注解 |
适用场景 | 遗留系统、非Java 5+环境 | 现代Spring应用 |