当前位置: 代码迷 >> 综合 >> AspectJ--5中通知总结及其他注解使用
  详细解决方案

AspectJ--5中通知总结及其他注解使用

热度:25   发布时间:2023-12-10 21:40:49.0

1 前置在上一篇

2后置

/*** @AfterReturning:后置通知*    属性: *     1.value 切入点表达式, 表示切面执行的位置*     2.returning 自定义的变量,表示目标方法的返回值, *                 这个变量名称必须和通知方法的参数名一样。*    位置:方法的上面* 特点:*  1.在目标方法之后执行的。*  2.能够获取到目标方法的返回值。*  3.不能影响目标方法的执行。*  * 参数*   JoinPoint : 必须是参数列表的第一个*  *  Object result =  doOther();*  myAfterReturning(result)*/@AfterReturning(value="execution(* *..SomeServiceImpl.doOther(..))",returning="result")public void myAfterReturning(JoinPoint jp,Object result){//修改目标方法的返回值if(result != null){String str = (String)result;result = str.toUpperCase();}System.out.println("方法的定义:"+jp.getSignature());//切面的功能,事务处理System.out.println("后置通知:在目标方法之后执行,能够获取到目标方法的返回值:"+result);

3 环绕

/*** @throws Throwable * @Around:环绕通知*    属性: value 切入点表达式。 表示切面执行的位置*    位置:在方法的定义的上面* 特点:*  1.在目标方法的前和后都能增强功能。*  2.控制目标方法是否执行*  3.能修改目标方法的执行结果。* *  环绕通知方法的定义*   1.必须有返回值, 表示目标方法的执行结果(可以是修改后的结果)*   2.必须有参数ProceedingJoinPoint , *     它主要用来执行目标方法(jdk中的method.invoke(target, args);)*/@Around(value="execution(* *..SomeServiceImpl.doFirst(..))") public Object myAround(ProceedingJoinPoint pjp) throws Throwable{Object obj = null;String uname = "";//获取目标方法执行时的参数Object args []=pjp.getArgs();if( args.length >1 ){Object arg = args[0];uname = (String)arg;}System.out.println("环绕通知:在目标方法之前,加入日志功能");if("lisi".equals(uname)){//执行目标方法,执行doFirst()obj  = pjp.proceed(); // doFirst() , method.invoke(target, args)}//修改目标方法的执行结果if(obj !=null){obj = "Hello Ok";}System.out.println("环绕通知:在目标方法之后,加入事务提交");//返回目标方法的执行结果return obj;}

4 异常

/*** @AfterThrowing :异常通知*    属性:*     1.value 切入点表达式, 表示切面执行的位置*     2.throwing 自定义的变量,表示目标方法抛出的异常对象, 必须和通知方法的参数名一样。*                通过throwing能够获取到目标方法的异常信息*    位置:*     在方法的定义上面* 特点*  1.在目标方法抛出异常时执行的,没有异常不执行*  2.不是异常处理程序, 它只是得到有异常发生。异常还是会被抛出的*  *  *  try{*      SomeServiceImpl.doSecond(..)*  }catch(Exception exception){*      myAfterThrowing(exception)*  }*/@AfterThrowing(value="execution(* *..SomeServiceImpl.doSecond(..))",throwing="ex")public void myAfterThrowing(Throwable ex){// 记录异常发生的数据,记录异常的时间,发生的位置,原因等, 记录到数据库或者日志文件// 发送邮件,短信,把异常发生情况发送给开发人员。System.out.println("异常通知:在目标方法抛出异常时执行,异常的原因是:"+ex.getMessage());}

5 最终

/*** @After:最终通知*   属性  value  切入点表达式*   位置 方法的上面* 特点:*  1.总是会被执行的。*  2.在目标方法之后执行的*  * try{*   SomeServiceImpl.doThird()* }finally{*   myAfter()* }*/@After(value="execution(* *..SomeServiceImpl.doThird(..))")public void myAfter(){//做程序的收尾工作,比如内存是否,资源回收。System.out.println("最终通知,总是会被执行的");}

@Pointcut

	/*** @After:最终通知*   属性  value  切入点表达式*   位置 方法的上面* 特点:*  1.总是会被执行的。*  2.在目标方法之后执行的*  * try{*   SomeServiceImpl.doThird()* }finally{*   myAfter()* }*/@After(value="mypt()")public void myAfter(){//做程序的收尾工作,比如内存是否,资源回收。System.out.println("最终通知,总是会被执行的");}@Before(value="mypt()")public void myBefore(){System.out.println("前置通知,在目标方法之前执行的");}/*** @Pointcut:定义和管理切入点。*    属性  value 表示切入点表达式*    位置 方法的上面* 特点:*   @Pointcut在一个方法的上面, 这个方法的名称就是切入点的别名。*   在其他的通知方法中, value属性可以使用方法名称,表示切入点*   */@Pointcut(value="execution(* *..SomeServiceImpl.doThird(..))")private void mypt(){//无需代码}