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í),俗話說磨刀不如砍柴工。