Latke在設計上原理相似與Spring,能夠理解爲是Spring的極簡版。html
本文章是對 https://hacpai.com/article/1466870492857 的補充前端
概述java
Latke是一個簡單易用的Java Web應用開發框架,包含IOC容器、事件通知、持久化、插件等組件,也包含一些應用開發時須要的基本服務(例如緩存、定時任務、郵件、HTTP客戶端等)程序員
整個框架採起MVC架構思想,經常使用的幾個註解是數據庫
@RequestProcessor //請求處理 控制器後端
@Inject //服務調用 緩存
@Service //服務實現 服務架構
@Repository //持久層註解 DAO層框架
引擎工具
所使用的引擎爲FreeMarker
主要使用的元素有:
${...} 這個表達式被稱爲interpolation(插值)。正如其名字所說,FreeMarker將其數據模型上的值取出替換表達式。
註釋 <#-- something -->
FTL標籤(FreeMarker模版的語言標籤)
<#if condition> ... <#elseif condition2> ... <#elseif condition3> ... <#else> ... </#if>
引擎實例
如:
1 <html> 2 <head> 3 <title>Welcome!</title> 4 </head> 5 <body> 6 <h1>Welcome ${user}!</h1> 7 <p>Our latest product: 8 <a href="${latestProduct.url}">${latestProduct.name}</a>! 9 </body> 10 </html>
在FreeMarker引擎上工做時,上面的${user} 就是取出數據模型中的數據,而整個HTML就是一個靜態的模版。用戶訪問時,引擎會根據用戶訪問的內容,更新數據。
如:
1 <html> 2 <head> 3 <title>Welcome!</title> 4 </head> 5 <body> 6 <h1>Welcome Abel Keith!</h1> 7 <p>Our latest product: 8 <a href="products/greenmouse.html">green mouse</a>! 9 </body> 10 </html>
數據模型
這裏的數據模型是樹形結構,圖形化能夠是這樣。這只是個形象化的解釋,數據模型不是文本格式,它來自於Java對象:
(root)
|
+- user = "Big Joe"
|
+- latestProduct
|
+- url = "products/greenmouse.html"
|
+- name = "green mouse"
用一句話歸納咱們將會使用的這個引擎:模版 + 數據模型 = 輸出
其它關於引擎就不詳述,若有興趣,就去搜索相關文件
IOC 容器
實現 JSR-330 規範 又稱 Java 依賴注入標準(JSR-330, Dependency Injection for Java)
詳情連接:https://blog.csdn.net/dl88250/article/details/4838803
這裏使用的javax.inject的注入爲依賴注入
不使用依賴注入,使用構造方法獲取對象的方法:
1 class Stopwatch { 2 final TimeSource timeSource; 3 Stopwatch () { 4 timeSource = new AtomicClock(...); 5 } 6 void start() { ... } 7 long stop() { ... } 8 }
經過工廠或者定位器實現
1 class Stopwatch { 2 final TimeSource timeSource; 3 Stopwatch () { 4 timeSource = DefaultTimeSource.getInstance(); 5 } 6 void start() { ... } 7 long stop() { ... } 8 }
添加清理方式的對象建立
1 void testStopwatch() { 2 TimeSource original = DefaultTimeSource.getInstance(); 3 DefaultTimeSource.setInstance(new MockTimeSource()); 4 try { 5 // Now, we can actually test Stopwatch. 6 Stopwatch sw = new Stopwatch(); 7 ... 8 } finally { 9 DefaultTimeSource.setInstance(original); 10 } 11 }
以上這些代碼在應用過程當中可能會引發各類沒必要要的複雜度,以及各類潛在的問題。
而依賴注入則能夠解決這些問題,提供了很高的彈性。它替程序員調用構造器或者工廠,一個稱做依賴注入器的工具將把依賴傳遞給對象:
1 class Stopwatch { 2 final TimeSource timeSource; 3 @Inject Stopwatch(TimeSource timeSource) { 4 this.TimeSource = timeSource; 5 } 6 void start() { ... } 7 long stop() { ... } 8 }
注入器會進一步地傳遞依賴給其餘的依賴,直到它構造出整個對象圖。當一個程序員建立一個StopwatchWidget實例:
1 /** GUI for a Stopwatch */ 2 class StopwatchWidget { 3 @Inject StopwatchWidget(Stopwatch sw) { ... } 4 ... 5 }
注入器可能會作這些工做:
1. 查找一個 TimeSource 實例
2. 使用找到的 TimeSource 實例構造一個 Stopwatch
3. 使用構造的 Stopwatch 實例構造一個 StopwatchWidget
這時候咱們簡單瞭解了,@Inject 可能會作那些事了,以及它在 Latke框架中IOC的做用
事件通知
經過事件管理器接口可進行時間監聽器註冊、事件發佈、實現發佈/訂閱模式
ORM
主要提供了對JSON對象的增刪改查功能,能夠支持關係型數據庫(MySQL、H二、SQLServer) 以及 Redis 的數據存取。
插件
插件包含完整的前端與後端功能,能夠在不修改已有代碼的前提下擴展應用功能,並支持運行時的拔插。
國際化
在模版中能夠直接使用 ${xxxx} 的形式讀取語言配置,後端提供了語言服務來獲取不一樣 Locale 的語言配置
服務
框架內置應用開發時須要的一些基本的經常使用服務:
小結
大致上須要補充的一些個性化內容就這些了。