java各類框架的比較,分析

Spring 框架
優勢
1.提供了一種管理對象的方法,能夠把中間層的對象有效地組織起來
2.採用了分層結構,能夠增量引入到項目中。
3.代碼測試較容易
4.非侵入性,應用程序對Spring API的依賴能夠減至最小
5.輕量級的架構解決方案
6.一致的數據訪問界面
 缺點
1.由於spring使用了控制反轉技術,因此應用程序的邏輯被中斷,代碼變得不完整,但看代碼沒法把握全部行爲,不能瞭解整個系統流程。
2.流程控制由不少xml配置文件來實現,增長了出錯的機會,以及開發人員的要求
3.維護階段須要維護配置文件或者配置文件+代碼的混合體,這比單純地維護代碼要困難的多
4.spring的性能通常,由於存在不少配置文件,須要讀取這些文件來實現控制,性能略有損失。因此對於簡單的應用,不推薦使用spring。Spring用於較複雜的應用
5.調試不直觀,後期的Bug對應階段不容易判斷問題所在
 

XFire是一個開源的框架,能夠很是容易得與spring集成。能夠很簡單地發佈一個Web Service。能夠將Web 服務綁定到POJO,XMLBeans。
支持基於HTTP、JXS等多種協議訪問Web服務。
支持多種Web服務業界重要標準,例如SOAP、WSDL、Web服務尋址。
高性能的SOAP實現
服務器客戶端代碼輔助生成
Xfire使得WebService開發變得十分簡單
Xfire使用Stax解析XML,性能有了質的提升。
XFire是基於SOAP/WSDL協議的,沒法用於開發RESTful風格的Web Service
 

Axis本質上就是一個SOAP引擎,提供客戶端,服務器端和網管SOAP操做的基本框架。但Axis並不徹底是一個SOAP引擎,它仍是一個獨立的SOAP服務器和一個嵌入Servlet引擎(例如Tomcat)的服務器。
Axis支持WSDL,提供轉化WSDL爲Java類的工具。提供例子程序。
Axis是與XFire並列的新一代Web Service框架,經過簡單的API支持Web Service各項標準協議。
XFire與Axis相比,優勢明顯。
   支持一系列Web Service的新標準
   使用Stax解釋XML,性能有了質的提升
   容易上手,能夠方便快速地從pojo發佈服務
   支持Spring 、Pico、Loom等容器
   高性能SOAP棧設計
   XFire比Axis1.3快2-6倍;

   XFire的響應時間是Axis1.3的1/2到1/5。
因此XFire比Axis相對受歡迎。
CXF
以上列舉的都是傳統的SOAP/WSDL模式的Web Service框架,接下來介紹幾種實現了RESTful風格的一些Web Service框架
Spring3.0之後已經實現了對RESTful的支持。主要表如今:
1.註釋,如@RequestMapping和@PathVariable,支持資源標識和URL映射
2.ContentNegotiatingViewResolver支持爲不一樣的MIME內容類型,並使用不一樣的表示方式。
3.使用類似的編程模型無縫地整合到原始的MVC層
 @Controller
publicclass EmployeeController {
@RequestMapping(method=RequestMethod.GET, value="/employee/{id}")
public ModelAndView getEmployee(@PathVariable String id) {
Employee e = employeeDS.get(Long.parseLong(id));
return new ModelAndView(XML_VIEW_NAME, "object", e);
}
}
如上@RequestMapping註釋是Spring REST特性的關鍵所在。它指定所註釋的方法將處理哪一個HTTP方法(RequestMethod.GET)和哪一個URI(/employee/{id})。注意:
 1.對於{id}佔位符,使用@PathVariable註釋能夠將{}內的值注入到函數的參數。
 2.XML_VIEW_NAME爲employees,這是在<servlet-name>-servlet.xml中定義的
 
 對於其餘方法是相似的。經過使用@RequestMapp註釋的功能,處理不一樣方法的代碼是很是類似的
@RequestMapping(method=RequestMethod.POST, value="/employee")
public ModelAndView addEmployee(@RequestBody String body) {
Source source = new StreamSource(new StringReader(body));
Employee e = (Employee) jaxb2Mashaller.unmarshal(source);
employeeDS.add(e);
return new ModelAndView(XML_VIEW_NAME, "object", e);
}

@RequestMapping(method=RequestMethod.PUT, value="/employee/{id}")
public ModelAndView updateEmployee(@RequestBody String body) {
Source source = new StreamSource(new StringReader(body));
Employee e = (Employee) jaxb2Mashaller.unmarshal(source);
employeeDS.update(e);
return new ModelAndView(XML_VIEW_NAME, "object", e);
}

@RequestMapping(method=RequestMethod.DELETE, value="/employee/{id}")
public ModelAndView removeEmployee(@PathVariable String id) {
employeeDS.remove(Long.parseLong(id));
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
return new ModelAndView(XML_VIEW_NAME, "employees", list);
}

在上面的代碼中,經過使用@RequestBody,HTTP請求的主體能夠做爲一個參數注入。
 
Spring3.0實現的RESTful Web Service仍然是基於MVC模型的,Control類中使用註釋來處理對應的請求,返回的結果仍是要提交到View層渲染輸出。在<servlet-name>-servlet.xml要配置內容協商服務。
<bean class="org.springframework.web.servlet.view
.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
<entry key="html" value="text/html"/> </map></property> <property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view
.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view
.UrlBasedViewResolver">
<property name="viewClass" value=
"org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>
定義了兩個視圖解析器。BeanNameViewResolver是負責處理的application/xml的,而另外一個UrlBasedViewResolver則負責處理text/html。
 
用Spring3.0實現Restful Web Service的優缺點
 1.擁有Spring的全部優勢以及缺點
 2.URl的映射在Control類中實現,不容易看出整個URI的結構(Restful Web Service的核心就在於URI的設計),也不利於修改,耦合度高
 3.返回內容的協商在View層中實現,由view層調用相應的頁面渲染,效率太低,而且意義不大,我認爲應該在Control類中直接調用便可。
 在編寫Web Service時,我認爲View層能夠忽略,由於Web Service傳輸地都是數據,不是很須要View渲染。
Restlet也支持REST。
特色:徹底拋棄了Servlet API,做爲替代,本身實現了一套API。可以支持複雜的REST架構設計。
缺點:
  1.雖然也能夠運行於Web容器中,可是難以利用Servlet和JSP等資源。還有由於須要另一套API和概念,學習成本較高。
  2.徹底不支持服務器端的HTTP Session,強制徹底基於無狀態服務器模型來作開發。對於基於瀏覽器的應用來講,開發難度較高。
  3.自身沒有包括與Spring的集成,可使用第三方代碼與Spring集成,集成難度較大。
  4.文檔不豐富,學習起來較困難。
  5.沒有內建的國際支持
優勢:
  1.有內建的HTTP認證機制,不須要另外開發安全機制
  2.靈活性較高,支持更多的REST概念,支持透明的內容協商,適合於開發更強大的REST組件
  3.零配置文件,所有配置經過代碼完成
 
Cetia4是一個對REST提供完善支持的Web開發框架
特色:基於Servlet API開發,能夠運行於全部的Web容器中
優勢:
  1.能夠充分利用Servlet API和JSP等資源,須要額外學習的概念較少,學習成本較低。
  2.對於傳統的Web應用,可使用服務器端的HTTP Session;對於Web服務類應用,不使用HTTP Session,基於無狀態服務器模型作開發。
  3.自身包括了對於Web MVC的支持
  4.內建了本身特有的導航對象棧的概念,對於傳統的Web應用開發很是有幫助。
  5. 提供了JSP標籤庫,對於傳統的基於HTML表單的Web開發很是有幫助。
  6. 支持與SiteMesh相配合,由SiteMesh來支持頁面佈局的重用。
  7. 內建有與Spring的集成,集成起來很是容易。
  8. 配置文件徹底基於標準的web.xml,不須要額外的配置文件。大量使用默認配置,通常狀況下足以知足常見的需求。
  9. 擁有很好的文檔。
  10. 有內建的國際化支持。
缺點:
  1.沒有內建的HTTP認證機制,須要本身開發安全機制。
  2.對於內容協商的支持比較弱,僅支持HTML和XML格式的數據。須要加以擴展才能支持其它格式的表現
 
Axis2,同時支持SOAP和REST風格的Web Service。但缺點很明顯,
  1.僅僅支持GET與POST方法
  2.僅僅是以REST風格暴露出Web服務,數據格式仍然是包含SOAP封裝的XML
  3.只支持同步的調用方式
  4.僅僅提供了以SOAP方式暴露Web服務的最小化支持,不支持全面的REST架構設計。
sqlREST,特色:1.爲任何能夠經過JDBC訪問的數據庫提供Web服務訪問接口,自動將REST風格的HTTP請求轉換成數據庫SQL語句。2.基於Servlet API開發
缺點:
 1.由於是REST風格的HTTP請求到SQL語句的直接映射,所以強制使用以SQL和關係數據庫爲中心的數據建模設計方法,不支持面向對象的設計。
 2.由於資源的定義僅限於數據庫的表,難以實現更高層次的抽象,必然會致使很是細粒度的API。應用的性能以及可伸縮性都難以保證。
 
Sun正在致力於創建REST風格Web服務的規範,JAX—RS(Java API for RESTful Web Service)
JAX-RS提供一些標註將一個資源類,一個 POJO Java類,封裝成Web資源。
 @Path,標註資源類或方法的相對路徑
 @GET,@PUT,@POST,@DELETE,標註方法是用的HTTP請求的類型
 @Produces,標註返回的MIME媒體類型
 @Consumes,標註可接受請求的MIME媒體類型
 @PathParam,@QueryParam,@HeaderParam,@CookieParam。@MatrixParam,@FormParam分別標註方法的參數來自於HTTP請求的不一樣位置,例如@PathParam來自於URL的路徑,@QueryParam來自於URL的查詢參數,@HeaderParam來自於HTTP請求的頭信息,@CookieParam來自HTTP請求的Cookie。
 
Jersey是JAX-RS的參考實現,即Jersey不是基於Servlet API的,而是採用了JAX-RS API。
1.Jersey採用了Annotation機制,全部的HTTP相關的參數設置都採用標註實現,所以,在編程的時候咱們針對的仍然是POJO,體會不到分佈式或J2EE編程的痛苦,只須要了解一些關鍵的Annotation便可。
2.Jersey是一個開發的平臺,咱們能夠擴展本身的需求,好比在消息格式上,雖然Jersey已經提供了Java基本數據類型、JSON、XML等類型,咱們仍是能夠很容易地擴展本身的格式。
3.Jersey創建的服務能夠很簡單地部署到JDK6自帶的輕量級Server上,過程極其簡單
4.Jersey創建的服務能夠很是容易地部署爲Servlet,支持各類J2EE容器
5.Jersey能夠爲咱們編寫的服務自動生成WADL
6.支持Spring。
相關文章
相關標籤/搜索