以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出文本。inv.invoke() 这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很方便地实现AOP。

    注意:**必须调用 inv.invoke() 方法**,才能将当前调用传递到后续的 Interceptor 与 Action。

    Invocation 作为 Interceptor 接口 intercept 方法中的唯一参数,提供了很多便利的方法在拦截器中使用。以下为 Invocation 中的方法:

    注意:jfinal 4.9.03 版本将 getControllerKey() 更名为了 getControllerPath(),原方法被保留仍然可用。更名为 getControllerPath() 是为了让多个 Controller 可以共享同一个 controllerPath 值。

    2、 全局共享,注意线程安全问题

    Interceptor 是全局共享的,所以如果要在其中使用属性需要保证其属性是线程安全的,如下代码将是错误的:

    1. public void intercept(Invocation inv) {
    2. // 多线程将会并发访问 value 值,造成错乱
    3. inv.invoke();