###前言: 一年前就接觸了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