AOP的各组成部件
■横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
■切面( aspect) : 类是对物体特征的抽象,切面就是对横切关注点的抽象
■连接点 ( joinpoint) :被拦截到的方法 ,字段或构造方法
■切入点( pointcut ) :对连接点进行拦截的定义
■通知( advice ) : 拦截到连接点之后要执行的代码
■目标对象( target ) : 代理的目标对象
AOP定义切入点
<aop:pointcut expression="execution(public void com.springdemo.service.impl.ProductServiceImpl.work(..) )" id="p1"/>
AOP定义切面方法
<aop:aspect ref="myAdvice"></aop:aspect>
AOP增强种类
advance,通知,在Spring中叫增强也许更加合理。所谓增强,其实就是向各个程序内部注入一些代码从而增强原有程序的功能。Spring使用增强类定义横切逻辑,同时由于Spring只支持方法连接点,增强还包括在方法的哪一点加入横切代码的方位信息,所以增强即包括横切逻辑,又包含部分连接点的信息。
-
前置增强
aop:before
doBefore(JoinPoint jp)
前四种绑定函数如此形式 -
后置增强
aop:after
-
异常增强
aop:after-returning
-
返回增强
aop:after-throwing
-
环绕增强
aop:around
doAround(ProceedingJoinPoint jp)
环绕增强如此形式增强名称 接口 描述 前置增强 org.springframework.aop.BeforeAdvice 在目标方法执行前来实施增强。 后置增强 org.springframework.aop.AfterReturningAdvice 在目标方法执行后来实施增强。 环绕增强 org.aopalliance.intercept.MethodInterceptor 在目标方法执行前、后实施增强。环绕增强是AOP联盟定义的接口,其他四种增强接口则是Spring定义的接口。 异常抛出增强 org.springframework.aop.ThrowsAdvice 在目标方法抛出异常后来实施增强 返回增强 org.springframework.aop.Introductioninterceptor 表示在目标类中添加一些新的方法和属性。引介增强是一种特殊的增强。他可以在目标类中添加属性和方法,通过拦截定义一个接口,让目标代理实现这个接口。他的连接点是类级别的,而前面的几种则是方法级别的。
AOP增强种类运行顺序
执行顺序为 前置增强----->目标函数------->后置增强-------->返回增强跟异常增强二选一
返回增强出现说明程序无异常无错误 即异常增强不执行或不存在 当出现异常增强 异常被catch 程序中断将会无返回 即返回增强不存在或不执行
AOP增强方法绑定方式
<aop:before method="doBefore" pointcut-ref="p1"></aop:before>
<aop:after method="doAfter" pointcut-ref="p1"></aop:after>
<aop:after-returning method="doReturn" pointcut-ref="p2"></aop:after-returning>
<aop:after-throwing method="doException" pointcut-ref="p1"></aop:after-throwing>
<aop:around method="doAround" pointcut-ref="p1"></aop:around>
AOP中开启@注解的使用与扫描开关包
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
AOP注解形式的使用
返回增强需要注明returning 异常增强需要注明throwing
@AfterReturning(value="execution(public int com.springdemo.service.impl.OtherServiceImpl.*(..))",returning = "re")
@AfterThrowing(value="execution(public int mul(int,int))",throwing="e")
其余为
@Around("execution(public int *(..))")
@After("execution(public int mul(..))")
@Before("execution(public int mul(int,int))")