Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的 核心目标。Interceptor 接口仅仅定了一个方法 void intercept(Invocation inv)。以下是简单的示例:
public class DemoInterceptor implements Interceptor {
public void intercept(Invocation inv) { System.out.println("Before method invoking"); inv.invoke();
System.out.println("After method invoking");
}
以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出 文本。inv.invoke()这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很 方便地实现 AOP。
nvocation 作为 Interceptor 接口 intercept 方法中的唯一参数,提供了很多便利的方法在拦 截器中使用。以下为 Invocation 中的方法:
方法 |
描述 |
void invoke() |
传递本次调用,调用剩下的拦截器与目标方法 |
Controller getController() |
获取 Action 调用的 Controller 对象(仅用于控制层拦截) |
String getActionKey() |
获取 Action 调用的 action key 值(仅用于控制层拦截) |
String getControllerKey() |
获取 Action 调用的 controller key 值(仅用于控制层拦截) |
String getViewPath() |
获取 Action 调用的视图路径(仅用于控制层拦截) |
<T> T getTarget() |
获取被拦截方法所属的对象 |
Method getMethod() |
获取被拦截方法的 Method 对象 |
String getMethodName() |
获取被拦截方法的方法名 |
Object[] getArgs() |
获取被拦截方法的所有参数值 |
Object getArg(int) |
获取被拦截方法指定序号的参数值 |
<T> T getReturnValue() |
获取被拦截方法的返回值 |
void setArg(int) |
设置被拦截方法指定序号的参数值 |
void setReturnValue(Object) |
设置被拦截方法的返回值 |
boolean isActionInvocation() |
判断是否为 Action 调用,也即是否为控制层拦截 |