JFinal3.0快速上手,極簡AOP開發(二十四)

在前一小節我們已經學會了實現簡單的AOP操作,那么今天繼續來增強一下補充學習如何設置全局的攔截與清除。

一、講在前面,理論先行

@Before注解可以用來對攔截器進行配置, @Clear可以清除對攔截器的配置。通過@Before注解可以配置Class、 Method的攔截器。

如你所愿@Before可以同時配置多個攔截器,語法:@Before({xxx.class,xxx.class}),其實很簡單就是在注解中使用{}分別配置要使用到的攔截器。示例如下:

package com.demo.test;

import com.demo.util.ClassInterceptor;
import com.demo.util.DemoInterceptor;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;

@Before(ClassInterceptor.class)
public class OrderController extends Controller {
    
   
   @Before(DemoInterceptor.class)
   public void index(){
       System.out.println("開始執行index方法,我是目標執行方法。");
       render("test.html");
   }
   
   public void SayHello(){
       System.out.println("這是一個沒有添加方法級的攔截的SayHello方法");
       renderNull();
   }
   
   @Clear
   public void SayBye(){
       System.out.println("這是一個干凈的方法");
       renderNull();
   }
   
}

二、精彩驗證,請勿走開

我們在控制器中編寫了index()、SayHello()、SayBye()方法,你能根據上述的理論,猜到程序運行的結果么?先思考一下。

這邊提供一下DemoInterceptor和ClassInterceptor的實現代碼,分別如下:
1、DemoInterceptor實現

package com.demo.util;

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

public class DemoInterceptor implements Interceptor {

    @Override
    public void intercept(Invocation inv) {
        System.out.println("Before method invoking");
        inv.invoke();
        System.out.println("After methon invoking");
        
    }

}

2、ClassInterceptor實現

package com.demo.util;

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

public class ClassInterceptor implements Interceptor{

    @Override
    public void intercept(Invocation inv) {
        System.out.println("這是類級別攔截的前置執行效果");
        inv.invoke();
        System.out.println("這是類級別攔截的后置執行效果");
        
    }
   
}

在兩個攔截器中,程序都只是向控制臺輸出打印了一段文字,你也許猜想到了執行效果,接下來就讓我們一起來驗證。

3、index方法

對index方法的攔截是比較有趣的,可以看出來攔截器是有執行順序(優先級)的。在沒有全局攔截器的情況下,先執行的是Class級別的攔截器,接著執行的是Method的級別的攔截器,最終執行的是目標方法。如果存在后置執行的方法則反之。這就像Java中的換括號表示作用域一樣,最外層的包裹的作用域自然越大。index方法執行了本身的攔截,還執行了Class級別的攔截。

index運行結果

4、SayHello方法

SayHello沒有在方法上使用攔截器,所以只會執行Class級別的攔截。
@Before(ClassInterceptor.class),這行代碼就是告訴jfinal,讓它對這個控制器中的action進行攔截。

SayHello運行結果

5、SayBye方法

@Clear清除了所有SayBye方法上層的攔截器對SayBye的攔截,所以SayBye不會執行Class級別的攔截。@Clear清除指定的攔截器語法如:@Clear(xxx.class);清除多個和添加一樣使用{},進行處理:@Clear({xxx.ass, xxx.class})。

SayBye運行結果

三、奇思妙想,大膽評測

如果在SayBye方法上添加一個Method的攔截器運行結果,會是怎么樣的好奇么?讓我們來試一試。

1、改造代碼,添加方法級攔截器

   @Clear
   @Before(DemoInterceptor.class)
   public void SayBye(){
       System.out.println("這是一個干凈的方法");
       renderNull();
   }

2、運行程序,檢查效果

這下可以理解清除上層攔截這個概念了吧?@Clear清除只針對上層的攔截。對于本層和下層的攔截不影響。

自帶主角光環的SayBye方法

PS:是不是感覺很好玩?那就趕快動起來吧。加油!親愛的小伙伴們!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 本小節主要學習配置全局的攔截器。任務簡單,目標明確。 一、全局配置攔截器,讓魚兒不漏網 全局攔截器主要是簡潔、高可...
    葉糖糖閱讀 2,583評論 1 1
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,366評論 11 349
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • 蟲子說: 不知大家吃的蛋撻是不是真的有蛋呢?? 呃,其實如果蛋撻液是自己做的話,是會有蛋的~~~ 只是,我買的是小...
    BT蟲子閱讀 506評論 0 0