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

本小節(jié)主要學(xué)習(xí)配置全局的攔截器。任務(wù)簡單,目標(biāo)明確。

一、全局配置攔截器,讓魚兒不漏網(wǎng)

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

1、配置文件

    /**
     * 配置全局?jǐn)r截器
     */
    public void configInterceptor(Interceptors me) {
        //配置全局的控制器攔截器
        me.addGlobalActionInterceptor(new ClassInterceptor());
        //配置全局的業(yè)務(wù)攔截器
        me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
    }

2、編寫GlobalServiceInterceptor攔截器

這是一個簡單的業(yè)務(wù)層攔截器,和以往一樣調(diào)用該方法的時候在控制臺輸出信息。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("這是全局業(yè)務(wù)層的攔截器前置操作~");
        inv.invoke();
        System.out.println("這是全局業(yè)務(wù)層的攔截器后置操作~");
        
    }
}

3、編寫OrderService業(yè)務(wù)層代碼

這是一個簡單的業(yè)務(wù)層實(shí)現(xiàn),我們會在下來的控制器中調(diào)用該方法。

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("你已經(jīng)成功完成了訂單支付!");
   }
}

4.鏗鏘有力改造OrderController

在OrderController中,我們?nèi)サ袅?code>@Before(ClassInterceptor.class)代碼,也就是說沒有顯示的為OrderController添加攔截器。增加了pay()方法,演示業(yè)務(wù)層攔截器的使用。

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("開始執(zhí)行index方法,我是目標(biāo)執(zhí)行方法。");
       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方法增強(qiáng)業(yè)務(wù)層
       OrderService service = enhance(OrderService.class);
       //調(diào)用支付方法
       service.Pay();
       renderNull();
   }
   
}

5、驗(yàn)證猜想與現(xiàn)實(shí)

首先啟動project,然后測試index方法,輸出如下圖信息。完美,這就證明控制層全局?jǐn)r截器已經(jīng)生效。接著我們一起來驗(yàn)證業(yè)務(wù)層的攔截器。

控制層全局?jǐn)r截效果

完美,業(yè)務(wù)層的全局?jǐn)r截器也已經(jīng)生效。

業(yè)務(wù)層全局?jǐn)r截效果

二、山外青山樓外樓

業(yè)務(wù)攔截是不是只有上述的方法呢?當(dāng)然不是,其實(shí)我們還可以使用Duang類和Enhancer 類,它們可以對任意目標(biāo)在任何地方增強(qiáng),使其擁有AOP的能力。

1、參悟代碼

   /**
    * 支付方法
    */
   public void pay(){
       //使用enhance方法增強(qiáng)業(yè)務(wù)層,第一種實(shí)現(xiàn)方式
       //OrderService service = enhance(OrderService.class);
       
       //第二種實(shí)現(xiàn)方式,Duang類
       //OrderService service=Duang.duang(OrderService.class);
       
       //第三種實(shí)現(xiàn),使用Enhancer類;這和第一種其實(shí)是一回事
       OrderService service=Enhancer.enhance(OrderService.class,Tx.class);
       //調(diào)用支付方法
       service.Pay();
       
       //返回null
       renderNull();
   }

2、這么做有什么意思?

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容