1 spring切面可以应用5种类型的通知
1)前置通知(Before):在目标方法被调用之前调用通知功能
2)后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
3)返回通知(After-returning):在目标方法执行成功之后调用通知
4)异常通知(After-throwing):在目标抛出异常之后调用通知
5)环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
2 spring支持的aop类型
1)基于代理的经典SpringAOP
2)纯POJO切面
3)@AspectJ注解驱动的切面
4)注入式AspectJ切面
3 spring只支持方法级别的连接点,AspectJ和JBoss不仅支持方法级别的切点,同时也支持字段和构造器级别的切点
4 通过切点来选择连接点,springaop支持的AspectJ切点指示器,如下:
---------------------------------------------------------------------------------------------------------------------
AspectJ指示器 描述
arg() 限制连接点匹配参数为指定类型的执行方法
@args() 限制连接点匹配参数由指定注解标注的执行方法
execution() 用于匹配是连接点的执行方法
this() 限制连接点匹配AOP代理的bean引用为指定类型的类
target 限制连接点匹配目标对象为指定类型的类
@target 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
within 限制连接点匹配指定的类型
@within 限制连接点匹配指定注解所标注的类型(当使用springaop时,方法定义在由指定的注解所标注的类里)
@annotation 限定匹配带有指定注解的连接点
---------------------------------------------------------------------------------------------------------------------
在Spring中尝试使用其他指示器时,将会抛出ILLegalArgument-Exception异常
5 编写切点
1)
package concert;
public interface Performance{
public void perform();
}
备注:上图中使用了"&&“操作符把execution()和within()指示器连接在一起形成与(and)关系(切点必须匹配所有的指示器).类似的我们可以用”||“操作符标识或(or)关系,而使用”!“操作符来标识非(not)操作.因为”&“在xml中有特殊含义,所以在spring的xml配置里面描述切点时,我们可以使用and来代替”&&".同样也可以使用or或not分别代替"||“和”!".
2)在切点中选择bean
execution(* concert.Performance.perform()) and !bean(‘woodstock’)
此时,切面的通知会被编织到所有ID不为woodstock的bean中