之前说过springbean,这篇我们看看spring aop
Aop对应的schema为http://www.springframework.org/schema/aop,前缀aop
同样,我们看一下用xmlspy打开aop的xsd, spring-aop-3.0.xsd
Config下面有三个节点。分别为pointcut,advisor和aspect
pointcut
pointcut切入点。定义切点的地方。他有一个id,和一个表达式,
id是名字,可以在通知里配置这个id,而通知里不再需要定义pointcut了,可以通过ID引用。
expression这个是配置切入点的通配表达式
advisor
这里面有五个节点
id,是可选的,可以不配置,但如果想在后面的aspect调用,是需要给一个名字的,如果没有,spring会随机生成一个。
advice-ref:这人是必选项,是通知的类的引用,也就是是一个spring bean,而这个类要求是实现Advice接口。
pointcut:切点,与上一个节点的expression含义是一样的。
Pointcut-ref:切点引用,就是上一个点节的id。
order次序,如果切面有多个通知,则可以使用order排序,order值小优先级高。这样就会实现多个织入顺序执行。
aspect
优先说节点
pointcut:切点,它和之前pointcut定义是一样的,两个属性,一个id,一个是expression
declare-parents:定义父类
他可以让一个指定规则的类,实现一个接口,与其说是让他实现接口,实际上他就像一个拦截器一样,对指定类,用代理转换
比如
<declare-parents types-matching=”com.x.A+” implement-interface=”com.x.I” default-impl=”com.x.C” />
他含义是指,如果有A类来申请对象,那么这里会转换成代理类,而这个代理默认会实现三个接口,其中有一个就是I,默认实现为C。也就是说如果C配置了切面,那么这个类,会顺理成章的走进了通知的类里。这里面有一个需要注意的是,C的类需要实现I接口。
default-impl与delegate-ref一个是配置类,一个是配置类的引用。
如果下面节点中有after,before,after-returning,after-throwing,around任意一个或多个,对于aspect节点中的属性,id,ref,order就需要有准确的值
当然id表示通知的名称,ref表式通知的引用,order表式次序
我们再看下面的节点
after是指在切面处执行之后 织入,如果切面方法出现异常,after也会执行,不会中断
before是指在切面处之前执行。
after-returning,是指在切面返回后再执行,这个时候 ,如果切面报错,则不会执行
after-throwing:如果切面有异常,会在异常执行完后,会通知执行。
around环绕执行,除非around会调用切面。不会切面将不会执行。
其实这五个属性都有些扩展属性
pointcut,point-ref一个是配置切面 ,一个是配置切面引用。
method,通知的API。
arg-name:由于织入的方法中没有切面信息,可以通知入参的方式进行传递
after-returning中含有returning,这个其实将返回结果传到织入的方法中
after-throwing中含有throwing,将异常传到织入的方法中