纠正:
环绕通知方法必须有返回值是错的,如果目标方法的返回值为空,则环绕通知的返回值就可以为void。还有,方法也不是必须要有ProceedingJoinPoint参数
总结:
Aspectj表示切面执行时间,用的通知(Advice)。
这个通知可以使用注解表示。
5个注解表示切面的5个执行时间, 这些注解叫做通知注解。
环绕置通知方法的定义
1)方法是public
2)方法是必须有返回值, 推荐使用Object类型
3)方法名称自定义
4)方法必须有ProceedingJoinPoint参数
public Object myAround(ProceedingJoinPoint pjp){
}
@Around(value="切入点表达式")
属性:value 切入点表达式
位置:在方法定义的上面
返回值:Object ,表示调用目标方法希望得到执行结果(不一定是目标方法自己的返回值)
参数: ProceedingJoinPoint, 相当于反射中 Method。
作用:执行目标方法的,等于Method.invoke()
===方法执行
@Around(value="execution(* *..SomeServiceImpl.doFirst(..))")
public Object myAround(ProceedingJoinPoint pjp){
System.out.println("执行了环绕通知的myAround方法");
return "Hello Around,不是目标方法的执行结果";
}
调用doFirst测试:
调用doFirst却执行了myAround。
手动实现:
调用doFirst只是形式上的,真实调用的是myAround().
myAround做什么,doFirst就做什么,myAround的返回值res
使用环绕通知: 就是调用切面类中的通知方法(myAround)。
1.在目标方法的前和后都能增强功能
2.控制目标方法是否执行
3.修改目标方法的执行结果。
查看ProceedingJoinPoint源码:
ProceedingJoinPoint代表正在执行的目标方法=doFirst
调用proceed就可以调用目标方法。
通过环绕通知可以执行切面类代码也可以控制目标方法(doFirst)的执行。
获取方法执行时的参数值:pjp.getArgs()
//获取方法执行时的参数值
String name = "";
Object[] args = pjp.getArgs();
if( args != null && args.length > 0){
Object arg = args[0];
if(arg !=null){
name=(String)arg;
}
}