我们实际对方法进行增强时往往还需要获取被增强代码的相关信息,比如方法名,类名,返回值,异常对象等。
我们可以在除了环绕通知外的所有通知方法中增加一个JoinPoint类型的参数,这个参数封装了被增强方法的相关信息,我们可以通过这个类型获取到除了异常对象和返回值以外的所有信息。
如图:
如果需要获取方法中的异常对象或者返回值则需要在方法参数上增加一个对应的类型的参数,并且使用注解的属性进行配置,这样spring会把你想获得的数值赋值给对应的方法参数。
@AfterReturning:
@AfterThrowing:
相信你肯定觉得上面的获取方式太麻烦了难以理解,就可以使用下面这种万能的方法。
ProceedingJoinPoint:
直接在环绕通知方法中增加一个ProceedingJoinPoint类型的参数,这个参数封装了被增强方法的相关信息。该参数的proceed()方法被调用相当于被增强方法被执行,调用后的返回值就相当于被增强方法的返回值。
如图所示:
获取被增强方法的相关信息:
增强代码中最后返回值就是在调用类中的res获取的值(应该是proceed)被增强类为UserService
(插入 通知分类)
@Before 前置通知,在目标方法执行方法。
@AfterReturning: 返回后通知,在目标方法执行后执行,如果出现异常就不会执行。
@After: 后置通知,在目标方法之后执行,无论是否出现异常都回执行。
@AfterThrowing: 异常通知,在目标方法抛出异常后执行。
@Around: 环绕通知,围绕着目标方法执行。
理解不同的通知执行时机(下面的伪代码是用来理解单个通知的执行时机的,不能用来理解多个通知情况下的执行顺序,如果需要配置多个通知我们会选择使用Around通知)
最后:
Signature getSignature() :获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息。
Object[ ] get Args(): 获取传入目标方法的参数对象。
Object getTarget() : 获取被代理的对象。
Object getThis: 获取代理对象。
其中关键方法就是getSignature() 该方法返回Signature()对象,而通过该对象我们可以获取被增强方法的信息。