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級攔截器之前而已。