Grails開(kāi)發(fā)團隊成員Marc Palmer發(fā)表了一篇博客文章,針對開(kāi)發(fā)人員對Grails常見(jiàn)的一些誤解逐一進(jìn)行了說(shuō)明。例如針對“對于我來(lái)說(shuō),Grails還不夠成熟”,他這樣回應:
針對這個(gè)誤解,我想不斷增長(cháng)的商業(yè)網(wǎng)站數量就是最好的答案了。同時(shí),Grails也是基于HIbernate、Spring和SiteMesh這些成熟完善的框架構建的,更不用說(shuō)作為萬(wàn)年常青樹(shù)的Java JDK了。Groovy項目都已經(jīng)有超過(guò)三年的歷史了。
接著(zhù),對于“Grails使用的是一門(mén)解釋型語(yǔ)言(Groovy)”這個(gè)誤解,他談到:
Groovy在運行時(shí)自動(dòng)編譯成Java虛擬機字節碼,它絕絕對對徹徹底底不是一門(mén)解釋型語(yǔ)言。句號。絕不。我說(shuō)了絕不了么?一點(diǎn)兒也沒(méi)錯。
最后,討論到Grails是否支持Rails的一個(gè)克隆產(chǎn)物,他如是回答:
Ruby on Rails引入了不少非常好的主意,并將它們合為一體。Grails將其中的一部分應用到了Groovy/Java的世界中,但加入了許多Ruby中并不 存在的特性和概念,所有這些東西都是以一種對Groovy和Java程序員有意義的方式展現給他們的。
Graeme Rocher順勢而上,也提出了自己的Grails誤解和問(wèn)題列表,比如說(shuō)“在我們有了JRuby on Rails之后,誰(shuí)還要Grails呢?”:
這個(gè)問(wèn)題很有代表性,也是對“Grails到底是什么”最大的誤解之一的根本所在。JRuby on Rails是讓Rails運行在像GlassFish這樣的Java EE容器上非常優(yōu)秀的方式之一,就是這樣而已。但Grails的目標卻大為迥異,它并不是Rails在Groovy語(yǔ)言上的一個(gè)移植版本,而是將業(yè)界內最 為強悍的組件(比如說(shuō)Spring、Hibernate、Quartz、Compass和SiteMesh等)以最佳方式組合起來(lái)的一個(gè)實(shí)踐,并通過(guò)采納 無(wú)配置規約(Convention-over-Configuration,CoC)使它們符合“不重復(Don‘t Repeat Yourself,DRY)”原則。
我們并不是在重造輪子,而且由于Grails內核的絕大部分都是以Java編寫(xiě)的,它也顯得更加強壯和穩定。事實(shí)上,從內核角度看Grails是一個(gè) Spring MVC應用,可以被部署到所有的主流容器之上,不僅僅只有Glasshfish,還有大型商業(yè)容器,比如說(shuō)WebLogic、WebSphere和 Oracle AS。
再有,“為什么Grails比Rails更適用于企業(yè)應用?”:
原因很多,最顯著(zhù)的兩個(gè)原因就是Spring和Hibernate。到目前為止,有不計其數的組織在采用Spring和HIbernate,他們都有既有的Spring上下文環(huán)境,以及已經(jīng)構造好的Hibernate領(lǐng)域對象等。
在我開(kāi)始參與Grails項目之前,我就經(jīng)歷過(guò)同樣的情況。我們設計Grails的目的就是為了讓它和這些框架盡可能無(wú)縫地整合起來(lái)。因此,我們打個(gè)比 方,你可以把一個(gè)用Java編寫(xiě)的Hibernate領(lǐng)域模型及其對應的配置文件直接扔進(jìn)Grails應用中,然后就可以使用動(dòng)態(tài)的查詢(xún)方法,并且直接使 用GORM了。
此外,Grails控制器使用了標準的Servlet API對象(如request、response和session等),因此可以和其它的Servlet一起使用。畢竟,掀起它的蓋頭之后,我們會(huì )發(fā)現它 不過(guò)是一個(gè)Spring MVC應用。另一方面,Rails幾乎是按照和EJB2一樣的方式設計的(在我發(fā)現這點(diǎn)時(shí),怎一個(gè)“震驚”二字了得?。?。也就是說(shuō),你在擴展 ActiveController和ActiveRecord等框架對象時(shí),你也就被綁定在了這套框架上。
在Rails里面根本就不存在領(lǐng)域模型的說(shuō)法,Rails的模型就是數據庫表。這當然是一件好事了,但在企業(yè)內部,同一個(gè)領(lǐng)域模型可能會(huì )在許多不同的應用 中服用,比如說(shuō)桌面應用和Web應用。在Java里,這實(shí)際上是非常成熟完善的,通過(guò)把類(lèi)對象及相應映射文件打包成一個(gè)JAR文件即可。
親愛(ài)的讀者,關(guān)于Grails,您還存在什么問(wèn)題嗎?或者您還見(jiàn)過(guò)對Grails用途的其它誤解么?請在InfoQ的Java社區與我們一同分享吧。