后置通知和前置通知差不多。最大的特点是因为后置通知是运行在目标方法之后的,所以他可以拿到目标方法的运行的结果。
给出案例:
案例结构图:
其实和上一篇的前置通知差不多,这里每个类就不做具体解释了。
第一步:
编写目标类:
package cn.itcast.spring.d_aspectj; //目标业务类 public class CustomerService { public int delete() { System.out.println("this is delete"); return 1; } }
第二步:
编写切面类
//切面类(内部可以写很多的Advice的方法) public class MyAspect { //可以传两个参数,后置通知相比前置通知来时 //一个特点是,因为后置通知是运行在目标方法之后的,所以他可以拿到目标方法的运行的结果 public void afterReturning(JoinPoint joinPoint,Object result) { System.out.print("后置通知的运行"+result); } }
第三步:编写Spring配置文件
<!-- AspectJ AOP --> <!-- 配置目标 --> <bean id="CustomerService" class="cn.itcast.spring.d_aspectj.CustomerService"></bean> <!-- 配置切面类 --> <bean id="MyAspect" class="cn.itcast.spring.d_aspectj.MyAspect"></bean> <aop:config> <!-- ref引用切面类 --> <aop:aspect ref="MyAspect"> <aop:pointcut expression="execution(* cn.itcast.spring.d_aspectj.CustomerService.*(..))" id="mypointcut2"/> <!-- 这个参数是配置返回的 必须和public void afterReturning(JoinPoint joinPoint,Object result)这个方法里面的 result一字不差--> <aop:after-returning method="afterReturning" returning="result" pointcut-ref="mypointcut2" /> </aop:aspect>
第三步:编写测试类
@Test public void testafter() {System.out.print(customerService.getClass().getName()); customerService.delete(); }
输出结果:
this is delete
后置通知的运行1
看到没 !返回了目标函数的执行结果。