jfinal ——AOP面向切面編程

###前言: 一年前就接觸了AOP的概念,而且對AOP的三種模式進行了系統的學習,至今仍是不能熟練地掌握和運用。今天針對jfinal框架的AOP,重點理解AOP的思想及實現。 這裏有篇Thoughtworks大牛之做,他所描述的AOP讓我有種新的認知輕鬆理解AOP思想(面向切面編程)html

###Jfinal中的AOP 編程

####AOP概述 傳統AOP實現須要引入大量繁雜而多餘的概念,例如:Aspect、Advice、Joinpoint、Poincut、Introduction、Weaving、Around等等,而且須要引入IOC容器並配合大量的XML或者annotation來進行組件裝配。以前雖然系統學過,但瞭解地並不深刻。若是您也想從傳統的方法過渡到如今的jfinal AOP這種切面編程思想,能夠了解一下咱們框架中AOP+IOC的方式     傳統AOP不但學習成本極高,開發效率極低,開發體驗極差,並且還影響系統性能,尤爲是在開發階段形成項目啓動緩慢,極大影響開發效率。     JFinal採用極速化的AOP設計,專一AOP最核心的目標,將概念減小到極致,僅有三個概念:Interceptor、Before、Clear,而且無需引入IOC也無需使用囉嗦的XML。 ####Interceptor Interceptor能夠對方法進行攔截,並提供就會在方法的先後添加切面代碼,實現AOP的核心目標。Interceptor接口僅僅定義了一個方法public void interceptor(Invocation inv),如下是簡單示例:框架

public class DemoInterceptor implements Interceptor{
public void intecept(Invocation inv){
System.out.println(「Before method invoking」);
Inv.invoke();
System.out.println(「After method invoking」);
}
}

以上代碼中的DemoInterceptor 將攔截目標方法,而且在目標方法調用先後向控制檯輸出文本inv.invoke() 這一行代碼是對目標方法的調用,在這一行代碼的先後插入切面能夠很方便地實現AOP.性能

####Before Before 註解用來對攔截器進行配置,該註解可配置class、method級別的攔截器,一下是代碼示例:學習

1.// 配置一個Class級別的攔截器,她將攔截本類中的全部方法
2.@Before(AaaInter.class)
3.public class BlogController extends Controller {
4. 
5.  // 配置多個Method級別的攔截器,僅攔截本方法
6.  @Before({BbbInter.class, CccInter.class})
7.  public void index() {
8.  }
9. 
10.  // 未配置Method級別攔截器,但會被Class級別攔截器AaaInter所攔截
11.  public void show() {
12.  }
13.}

如上代碼所示,Before能夠將攔截器配置爲Class級別與method級別,class級別的攔截器將攔截本類中全部的方法,method方法進攔截本方法。此外Before能夠同時配置多個攔截器,只須要在大括號內用逗號將多個攔截器進行分隔便可。設計

除了class和method級別的攔截器意外,Jfinal還支持全局攔截器以及Inject攔截器(Inject攔截將在後面介紹),全局攔截器分爲控制器層全局攔截器與業務層全局攔截器,前者攔截控制層全部Action方法,後者攔截業務層全部方法。code

全局攔截器須要在YourJFinalconfig 進行配置,一下是配置示例:htm

1.public class AppConfig extends JFinalConfig {
2.   public void configInterceptor(Interceptors me) {
3.      // 添加控制層全局攔截器
4.      me.addGlobalActionInterceptor(new GlobalActionInterceptor());
5.  
6.      // 添加業務層全局攔截器
7.      me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
8.  
9.      // 爲兼容老版本保留的方法,功能與addGlobalActionInterceptor徹底同樣
10.      me.add(new GlobalActionInterceptor());
11.   }
12.}

當某個Method被多個級別的攔截器所攔截,攔截器各級別執行的次序依次爲:Global、Routes、Class、Method,若是同級中有多個攔截器,那麼同級中的執行次序是:配置在前面的先執行。   攔截器從上到下依次分爲Global、Routes、Class、Method四個層次,Clear用於清除自身所處層次以上層的攔截器。     Clear聲明在Method層時將針對Global、Routes、Class進行清除。Clear聲明在Class層時將針對Global、Routes 進行清除。Clear註解攜帶參數時清除目標層中指定的攔截器。     在某些應用場景之下,須要移除Global或Class攔截器。例如某個後臺管理系統,配置了一個全局的權限攔截器,可是其登陸action就必須清除掉她,不然沒法完成登陸操做,如下是代碼示例:blog

1.// login方法須要移除該權限攔截器才能正常登陸
2.@Before(AuthInterceptor.class)
3.public class UserController extends Controller {
4.    // AuthInterceptor 已被Clear清除掉,不會被其攔截
5.    @Clear
6.    public void login() {
7.    }
8.    
9.    // 此方法將被AuthInterceptor攔截
10.    public void show() {
11.    }
12.}

    Clear註解帶有參數時,能清除指定的攔截器,如下是一個更加全面的示例:接口

1.@Before(AAA.class)
2.public class UserController extends Controller {
3.  @Clear
4.  @Before(BBB.class)
5.  public void login() {
6.     // Global、Class級別的攔截器將被清除,但本方法上聲明的BBB不受影響
7.  }
8. 
9.  @Clear({AAA.class, CCC.class})// 清除指定的攔截器AAA與CCC
10.  @Before(CCC.class)
11.  public void show() {
12.     // 雖然Clear註解中指定清除CCC,但她沒法被清除,由於清除操做只針對於本層以上的各層
13.  }
14.}

##參考資料 【1】輕鬆理解AOP思想(面向切面編程).http://www.javashuo.com/article/p-naxrtyim-dv.html 【2】jifnal官方文檔.https://www.jfinal.com/doc/4-3

相關文章
相關標籤/搜索