初始JFinal

    JFinal  是基於 Java  語言的極速  WEB  + ORM  開發框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java 語言全部優點的同時再擁有 ruby、python、php 等動態語言的開發效率!爲您節約更多時間,去陪戀人、家人和朋友!php

     在我尚未認識JFinal的理論知識前,我新建的第一個JFinalDemo項目,個人第一次感受是:太簡單了,太隨意了!哈哈,我是debug模式下啓動他的,而後我能夠直接在Java代碼中隨意的修改,而後頁面刷新,效果直接顯現出來!這就叫「熱編譯」。其次,我的還總結了JFinal的其餘主要特色:
  MVC 架構,設計精巧,使用簡單
  遵循 COC 原則,零配置,無 xml
  首創 Db + Record 模式,靈活便利
  ActiveRecord 支持,使數據庫開發極致快速
  自動加載修改後的 java 文件,開發過程當中無需重啓 web server
  AOP 支持,攔截器配置靈活,功能強大
  Plugin 體系結構,擴展性強
  多視圖支持,支持 FreeMarker、JSP、Velocity
  強大的 Validator 後端校驗功能
  功能齊全,擁有 struts2 絕大部分核心功能
  體積小僅 218K,且無第三方依賴java

JFinal 遵循大道至簡的設計思想。主要創新點:python

  • 微內核+全方位擴展架構;
  • Db + Record 模式;
  • CPI模式;
  • ActiveRecord模式Java實現方式;
  • API引導式配置;
  • API引導Validate;
  • 採用Scanner + ClassLoader結合Jetty實現熱加載;
  • 極簡設計,核心代碼約2000行實現Web MVC + ORM。

    

JFinal的架構及原理web

JFinal採用微內核全方位擴展架構,全方位是指其擴展方式在空間上的表現形式。數據庫

JFinal由Handler、Interceptor、Controller、Render、Plugin五大部分組成,以Action爲參照,Handler處在擴展的最外圍,Interceptor處在更貼近Action的周圍,Controller承載Action處在擴展的中心,Render處於Action後端,Plugin處於在Action側邊位置。後端

JFinal實現極速開發主要是由於走的極簡設計風格:零配置、代碼量少、開發體驗連續、無第三方依賴、概念最少化等等。ruby

要實現極簡設計,必需要爲架構注入靈魂,系統纔有本身的極簡性格。設計前先在腦海中造成一整套的極簡設計思想,讓這套思想融入到靈魂的深處,在行動時每動一個設計念頭時以此爲指導思想,最後的結果就能如願。架構

關於JFinal的介紹就很少說了,使用JFinal框架的人也愈來愈多了,關於它的介紹也不少。框架

 

下面是JFinal事務處理原理:學習

聲明式事務處理原理

上述配置中爲 savePost() 配置了事務也就是攔截器 Tx,當調用到 savePost() 的時候,是會進入到 Tx 的 intercept 方法中的:

  1. 創建數據庫鏈接;
  2. 設置事務隔離級別;
  3. 設置事務手動提交;
  4. 反射機制調用 savePost();
  5. 事務提交;
  6. 若事務失敗,就回滾。

主要代碼以下:

public void intercept(Invocation inv) { Config config = getConfigWithTxConfig(inv); if (config == null) config = DbKit.getConfig(); Connection conn = config.getThreadLocalConnection(); // 下面這段支持嵌套事務,能夠忽略不看 if (conn != null) { try { if (conn.getTransactionIsolation() < getTransactionLevel(config)) conn.setTransactionIsolation(getTransactionLevel(config)); inv.invoke(); return ; } catch (SQLException e) { throw new ActiveRecordException(e); } } Boolean autoCommit = null; try { // 1. 創建數據庫鏈接 conn = config.getConnection(); autoCommit = conn.getAutoCommit(); config.setThreadLocalConnection(conn); // 2. 設置事務隔離級別 conn.setTransactionIsolation(getTransactionLevel(config)); // conn.setTransactionIsolation(transactionLevel); // 3. 設置事務手動提交 conn.setAutoCommit(false); // 4. 反射機制調用 savePost()  inv.invoke(); // 5. 事務提交  conn.commit(); } catch (NestedTransactionHelpException e) { if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);} LogKit.logNothing(e); } catch (Throwable t) { // 6. 如有異常就回滾 if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);} throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t); } finally { try { if (conn != null) { if (autoCommit != null) conn.setAutoCommit(autoCommit); conn.close(); } } catch (Throwable t) { LogKit.error(t.getMessage(), t); // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown  } finally { config.removeThreadLocalConnection(); // prevent memory leak  } } }

JFinal官網:http://www.jfinal.com

相關文章
相關標籤/搜索