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

AOP( Aspect Oriented Programming),中文稱之為“面向切面的編程”。對于AOP編程,我們更加關(guān)注對哪些方法進(jìn)行攔截,如何去處理?切面,舉個栗子,如同大樹被電鋸鋸斷而露出有年輪的那一面。如下圖:

我理解的面向切面編程

一、為什么使用AOP?

AOP的優(yōu)勢有很多,每個人的關(guān)注點都不一樣。簡單的總結(jié)如下3點,歡迎補(bǔ)充探討。

  • 1、降低模塊之間的耦合度;
  • 2、面向擴(kuò)展開放,也就是說讓系統(tǒng)容易擴(kuò)展;
  • 3、更好的復(fù)用代碼。

二、JFinal中的AOP如何開車?

在JFinal中提供了Interceptor接口,讓我們來實現(xiàn)對方法的攔截,從而快速的實現(xiàn)AOP。在開車之前,我們先來查看一下接口的代碼。接口中定義了intercept方法,需要接收Invocation類型的參數(shù)。

1、閱讀源碼:
package com.jfinal.aop;

/**
 * Interceptor.
 */
public interface Interceptor {
    void intercept(Invocation inv);
}
2、實現(xiàn)一個接口:
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) {
        //目標(biāo)方法之前處理的事情
        System.out.println("Before method invoking");
        //目標(biāo)方法的調(diào)用
        inv.invoke();
        //目標(biāo)方法之后處理的事情
        System.out.println("After methon invoking");
        
    }
}

3、快速啟用Interceptor

演示案例中新建了OrderController控制器與test.html頁面,并為 OrderController配置了order路由。假裝你已經(jīng)會做這些操作了,在這小節(jié)就不贅述如何操作,如有不懂的請翻閱之前的操作手冊。

package com.demo.test;

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

public class OrderController extends Controller {
    
   //使用@Before配置實現(xiàn)的Interceptor
   @Before(DemoInterceptor.class)
   public void index(){
       System.out.println("開始執(zhí)行index方法,我是目標(biāo)執(zhí)行方法。");
       render("test.html");
   }
}
4、效果預(yù)覽

好不好看療效,各位看官請接著看,如下圖:

完美效果

三、擴(kuò)展延伸

通過以上的操作,我們已經(jīng)簡單的學(xué)會在JFinal中實現(xiàn)AOP。 Invocation參數(shù)提供了很多便捷的方法供開發(fā)者操作,小伙伴們可以盡情的嘗試。如下給出一段示例:

    @Override
    public void intercept(Invocation inv) {
        System.out.println("Before method invoking");
        //獲取控制器
        Controller con =inv.getController();
        System.out.println(con.toString());
        
        //獲取action key值
        String actionKey =inv.getActionKey();
        System.out.println(actionKey);
        
        //...更多操作請自行嘗試,詳見官方手冊
        inv.invoke();
        System.out.println("After methon invoking");
        
    }

PS:關(guān)于AOP的使用場景,還是比較多的比如打印日志,對訪問權(quán)限的控制等等。如果能掌握好這部分的知識,對于開發(fā)者來說簡直是如虎添翼。初學(xué)者,如果沒接觸過AOP建議先去了解一下,然后再回頭學(xué)習(xí),俗話說磨刀不如砍柴工。

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

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

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