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

本小節主要學習配置全局的攔截器。任務簡單,目標明確。

一、全局配置攔截器,讓魚兒不漏網

全局攔截器主要是簡潔、高可用,不需要在每個Class或者 Method上使用@Before手動的去進行攔截配置。在JFinal中可以配置全局的控制器層攔截器和業務層攔截器,接下來讓我們一起開始一段代碼之旅。

1、配置文件

    /**
     * 配置全局攔截器
     */
    public void configInterceptor(Interceptors me) {
        //配置全局的控制器攔截器
        me.addGlobalActionInterceptor(new ClassInterceptor());
        //配置全局的業務攔截器
        me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
    }

2、編寫GlobalServiceInterceptor攔截器

這是一個簡單的業務層攔截器,和以往一樣調用該方法的時候在控制臺輸出信息。ClassInterceptor和之前的代碼一樣,可以使用之前的。

package com.demo.util;

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

public class GlobalServiceInterceptor implements Interceptor {

    @Override
    public void intercept(Invocation inv) {
        System.out.println("這是全局業務層的攔截器前置操作~");
        inv.invoke();
        System.out.println("這是全局業務層的攔截器后置操作~");
        
    }
}

3、編寫OrderService業務層代碼

這是一個簡單的業務層實現,我們會在下來的控制器中調用該方法。

package com.demo.test;
public class OrderService {
    
    public static final OrderService oc=new OrderService();

    /**
     * @author sugarYe
     * @desc 支付方法
     */
![CK8D~MUSRQ]{J27UUV7X]OU.png](http://upload-images.jianshu.io/upload_images/1176189-33207cf30ab2f000.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

   public void Pay(){
       System.out.println("你已經成功完成了訂單支付!");
   }
}

4.鏗鏘有力改造OrderController

在OrderController中,我們去掉了@Before(ClassInterceptor.class)代碼,也就是說沒有顯示的為OrderController添加攔截器。增加了pay()方法,演示業務層攔截器的使用。

package com.demo.test;

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

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
   @Before(DemoInterceptor.class)
   public void SayBye(){
       System.out.println("這是一個干凈的方法");
       renderNull();
   }
   
   /**
    * 支付方法
    */
   public void pay(){
       //使用enhance方法增強業務層
       OrderService service = enhance(OrderService.class);
       //調用支付方法
       service.Pay();
       renderNull();
   }
   
}

5、驗證猜想與現實

首先啟動project,然后測試index方法,輸出如下圖信息。完美,這就證明控制層全局攔截器已經生效。接著我們一起來驗證業務層的攔截器。

控制層全局攔截效果

完美,業務層的全局攔截器也已經生效。

業務層全局攔截效果

二、山外青山樓外樓

業務攔截是不是只有上述的方法呢?當然不是,其實我們還可以使用Duang類和Enhancer 類,它們可以對任意目標在任何地方增強,使其擁有AOP的能力。

1、參悟代碼

   /**
    * 支付方法
    */
   public void pay(){
       //使用enhance方法增強業務層,第一種實現方式
       //OrderService service = enhance(OrderService.class);
       
       //第二種實現方式,Duang類
       //OrderService service=Duang.duang(OrderService.class);
       
       //第三種實現,使用Enhancer類;這和第一種其實是一回事
       OrderService service=Enhancer.enhance(OrderService.class,Tx.class);
       //調用支付方法
       service.Pay();
       
       //返回null
       renderNull();
   }

2、這么做有什么意思?

在寫swift的時候,有一點比較好的就是如果使用的原生類不夠強大,開發者可以使用關鍵字去擴展屬于自己的方法。在jfinal中其實我們可以使用 Enhancer.enhance()或 Duang.duang()來增強目標類或者目標方法。對于jar包不能使用常規的注解的時候,可以使用Inject 攔截器來增強。也就是前面所講的第三種實現方式。

PS:對于路由級別的攔截器,小伙伴們就請自由發揮吧。這里就不贅述了。

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

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 在前一小節我們已經學會了實現簡單的AOP操作,那么今天繼續來增強一下補充學習如何設置全局的攔截與清除。 一、講在前...
    葉糖糖閱讀 1,512評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,285評論 25 708
  • “寂寞深閨,柔腸一寸愁千縷。惜春春去。幾點催花雨。倚遍闌干,只是無情緒。人何處。連天衰草,望斷歸來路。(衰草 一作...
    至于耶路撒冷閱讀 285評論 0 0
  • 他,一襲白衣,手拿長劍,每日必來這相思湖畔練劍。 她,長發飄飄,手提花籃,每日都到這相思湖畔采花。 他知道她,她也...
    灼兮閱讀 187評論 0 0