JFinal框架學習--- 攔截器的使用

  在JFinal中,JFinal提供了Interceptor接口來實現攔截器的做用,從而快速實現Aop。攔截器用於在某個方法或字段被訪問以前,進行攔截而後再在該方法以前或者以後加入一些操做。java

1.攔截器的分類以及配置:

在JFinal中,攔截器分爲全局攔截器,Class級別的攔截器,Method級別的攔截器。(其中全局攔截器分爲控制層的全局攔截器與業務層的全局攔截器)。使用@Before註解能夠對Class級別的攔截器以及Method級別的攔截器進行配置。ide

(1) 全局攔截器:

使用全局攔截器時須要在JFinalConfig的實現類中的configInterceptor(Interceptors me)方法中添加攔截器。該攔截器對於全部的Controller都有效。spa

  在Interceptor包下新建TextInterceptor類並實現Interceptor接口:.net

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的實現類中配置全局攔截器:3d

而後咱們運行一下項目,調用一個控制器的方法後,控制檯輸出:code

(2)Class級別的攔截器:

新建一個classInterceptor攔截器:對象

並在Controller中使用@Before註解對這個攔截器進行配置:blog

執行結果:接口

咱們能夠看出,全局攔截器以及class級別的攔截器全都有調用。get

(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中:

運行結果:

 

2、@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級攔截器以前而已。

相關文章
相關標籤/搜索