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(){//无需代码}