粗略的看JFinal的基于AOP的拦截器的实现
2019獨角獸企業重金招聘Python工程師標準>>>
簡單的說一下AOP的實現,所謂AOP,即(Aspect Oriented Programming)的縮寫,體現在程序中就是你可以通過配置在任意的代碼塊前后插入你想插入的執行代碼。例如日志、事務、權限驗證等。
首先看看Jfinal中基于@Before注解的攔截器如何用:
上面是一個簡單的Controller。JFinal中Interceptor其實是由三種粒度,全局攔截器,Controller攔截器已經Method級別的攔截器,上面中體現了兩點,這里我們僅對Method級別的攔截器進行剖析。
在JFinal中使用攔截器必須繼承Interceptor接口:
這個接口很簡單,只包含一個以ActionInvocaton為參數的方法,對于ActionInvocation顧名思義就是Action調度者,先來看看ActionInvocation的基本定義:
ActionInvocation會有一個invoke方法,調度Action的時候應該是new ActionInvocation().invoke()這個樣子的形式。這個可以在
com.jfinal.core.ActionHandler中找到:
/**
-
handle
-
1: Action action = actionMapping.getAction(target)
-
2: new ActionInvocation(...).invoke()
-
3: render(...)
*/
上面可以看出,其實Action的調度者ActionInvocation實現了動態代理的功能,參考文章:JDK和CGLIB動態代理
攔截器實現類如下:
Before為用戶自定義注解:
來看看框架是如何根據注解獲取攔截器class的,這個要看JFinal的InterceptorBuilder類的實現:
注釋可以看出這是一個方法級別的攔截器構造,Method講師通過反射得到的index方法實例,而Method為我們提供了getAnnotation方法,這個方法可以獲取Before.class的注解,接著看createInterceptor方法的實現:
createInterceptor將構造一個hashMap,保存對應攔截器的名稱和實例。整個執行流程是這樣的: 用戶請求Action,ActionHandler處理用戶的請求,內部獲取對應的Action,其中Action中保存著已經構造好的攔截器信息,ActionHandler將用Action實例構造ActionInvocation實例,ActoinInvocation.invoke()將會實現切面代碼和Action代碼的執行。
轉載于:https://my.oschina.net/liuh1988/blog/357635
總結
以上是生活随笔為你收集整理的粗略的看JFinal的基于AOP的拦截器的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10g备份导入
- 下一篇: document.createEleme