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