超敏捷 Java 開發框架 ServcieFramework 作者祝海林專訪
該專案目前應用於作者公司內部的一個產品中,剛開源不久,便引起了開發者的廣泛關注與討論。為了使大家進一步瞭解該框架,我們專訪了作者祝海林。
歡迎大家推薦更多開源專案給我們,支援中國的開源專案發展,如果您和您的團隊希望展示創業理念和有趣之處,或者有朋友正在創造這樣的價值,請聯絡我們,發信到[email protected]即可。
先來個自我介紹吧!
網名 WilliamZhu,微博@PrinceCharmingJ。Java程式設計師,4年開發經驗,2010年懵懂來京。有過短暫幾天Rails程式設計師生涯,頗為自豪。曾經為了建立一個音樂新模式的嘗試而奮鬥過,至今仍念念不忘。現專注於搜尋和資料探勘領域。平常的愛好就是向大牛們提問、聆聽、學習。
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比較重視。客戶端會根據不同狀態碼進行不同處理,nutz就顯得支援有點弱了。最後我跟老闆說,給我機會,我可以寫個更輕量,更RESTFul的。於是便在老闆的支援下有了ServcieFramework。目前該專案應用在我們的搜尋產品中。
開發效率比肩Rails,如何體現?是如何實現的?
你可以 clone ServiceFramework一份下來試試。當然從文件也是能夠直觀看到的。待會我會舉幾個小例子。
另外之前我也發過一篇關於
為了充分說明開發的便捷性,我直接在這篇採訪稿中做個例子。
建立一張表:
--標籤表
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;
定義兩個類:
public class Tag extends Model {
@Validate
private final static Map $name = map(
presence, map("message", "{}欄位不能為空"),
uniqueness, map("message", "{}欄位不能重複")
);
@ManyToMany
private List<TagGroup> tag_groups = list();
}
public class TagGroup extends Model {
@ManyToMany
private List<Tag> tags = list();
}
Ok了,模型類建立完畢。 寫一個controller:
public 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的查詢形式。比如:
List<Order> 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則進一步簡化了這個操作。
- 位元組碼增強。比如javassist、cglib等。代表有PlayFramework。
- AOP 通過對註解等的解析,生成相應的切面檔案。不過這需要特定的編譯器。代表有 Spring ROO。
- 還有就是通過IDE生成根據模板生成一些檔案。這個可操作性不強。
我也可以直接用Rails(或者基於JVM的jRuby、Grails),為何還要使用這個框架?
如果你想用Java,並且想獲得類似Rails的敏捷開發效率,那麼用ServiceFrameowrk。
轉換語言需要考慮很多問題。比如Rails是多程序模型,而Java專案通常是單程序多執行緒的。並且Ruby VM 和 JVM 在效能、健壯性、監控、GC等各個
方面還是有差距的。至於JRuby、Grails等基於JVM上的語言,和原生Java的整合並不如想象中的那麼完美。
對於一般的網際網路應用,如果你能夠採用指令碼語言,建議優先考慮Ruby(CRuby),接著Groovy,然後JRuby。
和其他框架(如Play)相比,ServcieFramework有什麼優勢或獨特之處?
應該說ServiceFramework得到Play的很多啟發。Play是一個優秀的Java MVC框架。Play優於ServiceFramework的地方自然很多。
個人覺得ServiceFramework不同於Play的地方:
- Play簡單的引入JPA,當然提供了一些比較有意義的便利方法。而ServiceFramework完全簡化了JPA,操作起來就和ActiveRecord差不多。
- Play的Query Interface簡單引入EBean,但是EBean完全是個靜態語言的折中產物。
- ServiceFramework對C層的Filter做過重新設計,非常好用。
從名字看出,這是一個寫後端服務的框架。高效、敏捷符合移動網際網路對快速開發的要求。並且能夠獲得Java社群帶來所有好處。
ServcieFramework並不適合企業開發,企業開發有點過於複雜,而且我也沒有做過企業方面的開發。今後ServiceFramework 的roadmap 也是繼續強化對移動網際網路的開發支援。目前我在諮詢一些做app後端的朋友,看如何簡化他們的開發。
ServcieFramework的學習成本?
通常情況下,你只要把ServiceFramework頁面的README看完就行了。
接著 `git clone git://github.com/allwefantasy/ServiceFramework.git`,就可以新增controller、model,著手開發專案了。
基於什麼開源協議?在專案中使用ServcieFramework應該注意哪些方面?
GPL 2.0開源協議。
ServiceFramework為了一個具體需求而誕生的,所以並不是適合所有的專案。只針對特定領域的需求。比如移動網際網路後端服務的開發就很適合使用ServiceFramework。
建議留意README中的一些提示。我這裡重點提示幾點,在目前這個版本下:
- 不要在舊專案中使用
- 要遵循約定
- 目前還不能放到標準的web容器比如tomcat、weblogic等。
該專案未來的發展計劃?
未來會根據使用情況來進行功能修補增強。下一步計劃,我可以預見到的是:
- 隔絕ServiceFramework本身的依賴。也就是你看不到框架本身對第三方jar的依賴
- 為模型類提供更多的自生成方法
- 開始填補之前的仿PHP函式庫
- 我會開始尋求合作者,共同開發
目前專案貢獻者情況?其他開發者如何參與?
開源沒多久。目前就我一個人維護。不過已經應用於公司內部的一個專案,所以大家不用擔心使用性。當然如果真的要用,我建議先用在小專案中。
如果要參與的話,可以直接到
ServiceFramework Fork一份下來,然後請求 merge 就行。想重度參與的可以聯絡我
[email protected]