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 的语言配置
服务
框架内置应用开发时须要的一些基本的经常使用服务:
小结
大致上须要补充的一些个性化内容就这些了。