JFinal框架学习--- 拦截器的使用

  在JFinal中,JFinal提供了Interceptor接口来实现拦截器的作用,从而快速实现Aop。拦截器用于在某个方法或字段被访问之前,进行拦截然后再在该方法之前或者之后加入一些操作。

1.拦截器的分类以及配置:

在JFinal中,拦截器分为全局拦截器,Class级别的拦截器,Method级别的拦截器。(其中全局拦截器分为控制层的全局拦截器与业务层的全局拦截器)。使用@Before注解可以对Class级别的拦截器以及Method级别的拦截器进行配置。

(1) 全局拦截器:

使用全局拦截器时需要在JFinalConfig的实现类中的configInterceptor(Interceptors me)方法中添加拦截器。该拦截器对于所有的Controller都有效。

  在Interceptor包下新建TextInterceptor类并实现Interceptor接口:

package com.Interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

public class globalInterceptor implements Interceptor{
    @Override
    public void intercept(Invocation inv) {
        inv.invoke();
        System.out.println("调用了globalInterceptor拦截器");
    }
}

 然后在JFnalConfig的实现类中配置全局拦截器:

然后我们运行一下项目,调用一个控制器的方法后,控制台输出:

(2)Class级别的拦截器:

新建一个classInterceptor拦截器:

并在Controller中使用@Before注解对这个拦截器进行配置:

执行结果:

我们可以看出,全局拦截器以及class级别的拦截器全都有调用。

(3)Method级别的拦截器:

package com.Interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

public class methodInterceptor implements Interceptor{
    @Override
    public void intercept(Invocation inv) {
        inv.invoke();
        System.out.println("调用了methodInterceptor拦截器");
    }
}

在Controller中:

运行结果:

二、@Clear注解

   在某些场景下使用拦截器的时候,可能我们在Controller中除了一个方法不需要使用拦截器以外,其他方法都需要使用。这时,如果我们使用Method级别的拦截器,在每一个action上添加@Before,这就显得很麻烦。而JFinal为我们提供了@Clear注解,这为我们很好的解决了这个问题。

  在JFinal中,拦截器从上到下依次分为Global,inject,Class,Method。

 Clear用法技巧:

  • 只清除Clear本身所处层的向上所有层,本层与下层不清除。
  • 当Clear不带参数时清除所有的拦截器,当带参数时清除指定拦截器。

(1)当Clear在Method层时清除了 Method以上的所有拦截器:

(2)当Clear在Class级别时:

(3)当Clear带参数的时候:

输出结果:

清除了classInterceptor拦截器。

三,Interceptor的触发

   JFinal中的Aop分为控制层Aop以及业务层Aop。控制层的Aop在action运行时将会被触发,而业务层Aop则需要先使用enhance()方法对目标对象进行增强,然后再调用目标方法即可。

下面是业务层拦截器的实例:

(1)在service层中:

(2)在controller层中:

控制台输出:

四.Enhancer、Duang------对目标进行增强

在上面的例子中我们使用了Enhancer对目标对象进行增强使其具有Aop能力,下面我们来看看如何使用Duang:

五. Routes级别的拦截器:

 Routes级别拦截器是指在Routes中添加的拦截器。该拦截器对所有controller中的action都具有烂机器作用。并且将在class级别拦截器之前被调用。

六.Inject拦截器

Inject拦截器是指在使用enhance或duang方法增强时使用参数传入的拦截器。Inject可以对目标完全无侵入地应用AOP。

与Class级拦截器一样,Inject拦截器将拦截被增强目标中的所有方法。Inject拦截器可以被认为就是Class级拦截器,只不过执行次序在Class级拦截器之前而已。

猜你喜欢

转载自my.oschina.net/u/3952492/blog/2051944