今天在项目中成功实现了spring aop 。
@Before @After @AfterReturning @Around @AfterThrowing
这五个是实现spring aop常用的五个注解
相关的注解还有@Aspect @Component @PointCut
我在实践中发现:
[email protected] @After @AfterReturning @Around 这四个通知只有用一种,如果使用两种及以上会发生一些问题。
[email protected]@PointCut 注解的方法不会被执行,只起到了一个把切面表达式抽象出来的作用。
[email protected]是最常用的:
使用 JointPoint.getArgs()可以获取执行目标方法时传入的参数。(同@Before @After @Around @AfterThrowing)
@AfterReturning注解中的returning = "object"应该和形参的object名字一致 ,用来接收目标方法的返回值。
@AfterReturning(pointcut="execution(...) " returning="object") public void afterReturning(JointPoint jp,Object object){
//注意这里的object 应该和returning="object"保持一致 System.out.println(object); //object是目标方法返回的参数 System.out.println(jp.getArgs() ); //通过这种方法可以获取目标方法的传入参数 }
下面是更具体的内容:
@Aspect @Componet public class myPointCut{ @Before("execution(...) ") public void before(){ System.out.println("前置通知:在目标方法执行前执行" ); } @After("execution(...) ") public void after(){ System.out.println("后置通知:在目标方法执行后执行" ); } @Around("execution(...) ") public void around(){ System.out.println("环绕通知:在目标方法执行前后都执行" ); } @AfterReturning(pointcut="execution(...) " returning="object") public void afterReturning(JointPoint jp,Object object){
//注意这里的object 应该和returning="object"保持一致 System.out.println(object); //object是目标方法返回的参数 System.out.println(jp.getArgs() ); //通过这种方法可以获取目标方法的传入参数 } @AfterThrowing("execution(...) ") public void afterThrowing(){ System.out.println("异常通知:在目标方法发生异常时执行" ); } }