ServcieFramework是一個敏捷、快速、富領域模型的Java MVC 框架,其設計理念是讓用戶真正能夠用最簡單的方式解決80%的問題。
該項目目前應用于作者公司內部的一個產品中,剛開源不久,便引起了開發者的廣泛關注與討論。為了使大家進一步了解該框架,我們專訪了作者祝海林。
歡迎大家推薦更多開源項目給我們,支持中國的開源項目發展,如果您和您的團隊希望展示創業理念和有趣之處,或者有朋友正在創造這樣的價值,請聯系我們,發信到blog@csdn.com即可。
先來個自我介紹吧!
網名 WilliamZhu,微博@PrinceCharmingJ。Java程序員,4年開發經驗,2010年懵懂來京。有過短暫幾天Rails程序員生涯,頗為自豪。曾經為了創建一個音樂新模式的嘗試而奮斗過,至今仍念念不忘?,F專注于搜索和數據挖掘領域。平常的愛好就是向大牛們提問、聆聽、學習。
ServcieFramework 是什么?
ServcieFramework,一個敏捷、快速、其ORM 和 Controller等設計會 surprize 你的一個 Java MVC 框架,專為移動應用后端量身定做,適用于快速搭建一個后端服務(說的好像有點拗口,oh yeah~~~)
ServcieFramework 三大亮點:
ORM 實現真正的充血模型,非常 ActiveRecord 化。
非常輕量,你完全看不到servlet api,因為壓根就沒有使用Servlet規范。應用本身是一個普通的Java程序,http監聽只是其中的一個模塊。
便于測試。模型類和controller都可以當作普通的類來進行測試。
發起這個項目的初衷是什么?
項目的起源是我們要用Java寫一個后臺服務,提供Web API,但覺的Spring太重,后來我們用nutz開發,但仍然覺得nutz有很多限制,比如,我們對response status比較重視??蛻舳藭鶕煌瑺顟B碼進行不同處理,nutz就顯得支持有點弱了。最后我跟老板說,給我機會,我可以寫個更輕量,更 RESTFul的。于是便在老板的支持下有了ServcieFramework。目前該項目應用在我們的搜索產品中。
開發效率比肩Rails,如何體現?是如何實現的?
你可以 clone ServiceFramework一份下來試試。當然從文檔也是能夠直觀看到的。待會我會舉幾個小例子。
另外之前我也發過一篇關于ServiceFramewok的資訊,不愿意看文檔的同學也可以看看這篇簡短的資訊。
為了充分說明開發的便捷性,我直接在這篇采訪稿中做個例子。
建立一張表:
[sql] view plaincopy--標簽表
CREATE TABLE `tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`tag_synonym_id` int(11) DEFAULT NULL,
`weight` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--標簽組。一個標簽可以屬于多個標簽組。一個標簽組包含多個標簽
CREATE TABLE `tag_group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
定義兩個類:
[java] view plaincopypublic class Tag extends Model {
@Validate
private final static Map $name = map(
presence, map("message", "{}字段不能為空"),
uniqueness, map("message", "{}字段不能重復")
);
@ManyToMany
private List tag_groups = list();
}
public class TagGroup extends Model {
@ManyToMany
private List tags = list();
}
Ok了,模型類建立完畢。 寫一個controller:
[java] view plaincopypublic class TagController extends ApplicationController {
@BeforeFilter
private final static Map $check_params = map(only, list("save"));
@At(path = "/blog", types = POST)
public void save() {
if(!Tag.save(params())){
render(HTTP_400,tag.validateResults);
}
render(ok());
}
private void check_params(){
if(isEmpty(param("tag")))render(HTTP_400,"您至少需要傳遞一個name字段");
}
}
一個簡單的例子就做完了。查詢方面提供了Arel的查詢形式。比如:
[java] view plaincopyList orders = Order.where("status=:status",map("status",Order.Status.NEW)).joins("details").fetch();
ServiceFramewok實現重點有三個方面:
簡化ORM框架。在我看來,Rails 的ActiveRecord是ORM的最佳實踐。ServiceFramework的ORM基本是照著它改的。
重新設計Controller中的 filter(interceptor)。各種before filter、around filter 可以有效簡化邏輯應用。而框架本身則努力簡化filter的使用。
規范化項目目錄。目前大部分新的框架都是這么做到的。一開始就給你生成一個標準的項目目錄結構。ServiceFramework則進一步簡化了這個操作。
順帶提一下目前類似Rails的Java框架可能會用到的一些技術:
字節碼增強。比如javassist、cglib等。代表有PlayFramework。
AOP 通過對注解等的解析,生成相應的切面文件。不過這需要特定的編譯器。代表有 Spring ROO。
還有就是通過IDE生成根據模板生成一些文件。這個可操作性不強。
原文轉自:http://www.anti-gravitydesign.com