<!--配置aop-->
<aop:config>
<!--配置切入点:也就是要给那个方法进行增强--><!--*表示返回类型为任意类型;..表示传递的参数为任意参数-->
<aop:pointcut id="pointcut" expression="execution(* com.ctbu.dao.UserDao.save(..))"/>
<aop:pointcut id="pointcutUpdate" expression="execution(* com.ctbu.dao.UserDao.update(..))"/>
<aop:pointcut id="pointcutDelete" expression="execution(* com.ctbu.dao.UserDao.delete(..))"/>
<!--配置切面:也就是增强的功能是什么-->
<aop:aspect ref="myAspect"><!--告诉增强的方法在那个类里-->
<!--前置通知-->
<aop:before method="check" pointcut-ref="pointcut"/>
<!--后置通知-->
<aop:after-returning method="log" pointcut-ref="pointcutUpdate" returning="res"/>
<!--环绕通知-->
<aop:around method="around" pointcut-ref="pointcutDelete"/>
</aop:aspect>
</aop:config>
前置通知
如上代码所示:
<aop:before method="check" pointcut-ref="pointcut"/>就是一个前置通知,意思就是在要增强的方法前面执行
后置通知
<aop:after-returning method="log" pointcut-ref="pointcutUpdate" returning="res"/>这个就是一个后置通知,也就是在要增强的方法执行完了之后再执行
注意点:因为是再被增强方法执行完了之后再执行,所以是可以获取到被增强方法的返回值的,不过这里的返回值有一个注意点,那就是returning="res" 这里的这个值,必须和增强方法的形参名称保持一致。 如下代码,他的形参名也叫res!必须保持一致
public void log(String res){
System.out.println("添加日志"+res);
}
环绕通知
<!--环绕通知-->
<aop:around method="around" pointcut-ref="pointcutDelete"/>这就是一个环绕通知,也就是可以再被增强方法之前执行一些操作,在被增强方法之后执行一些操作
环绕通知应该这样写
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("添加事务");
Object proceed = joinPoint.proceed();//执行原有的方法
System.out.println("提交事务");
return proceed;
}
异常通知:
使用方法同上,但是是在程序出现异常的时候才会触发通知方法:同样可以获取到异常的信息,获取方法和后置通知相同
最终通知:
不管程序有没有异常,都会触发的通知方法