什么是JavaEE,什么是Spring


作者:大寬寬
鏈接:https://www.zhihu.com/question/268742981/answer/341770209
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

在回答題主的問題之前,我先要簡單介紹一下什么是JavaEE,什么是Spring。

JavaEE是一組建立在JavaSE之上的標准,解決企業級開發中的一系列問題。請特別留意,它僅僅是個標准,是對一系列接口的約定,眾多廠商圍繞這個標准做實現。如JBoss,WebSphere等。第一個版本的JavaEE 1.2在1999年被發布,到2017年的JavaEE 8,已經經歷了將近20年。

那么JavaEE都有哪些標准,解決了什么問題呢?我這里簡單列舉一下主要的標准:

  • Servlet:定義了如何處理Web請求,這個相信大家最熟悉
  • Java Server Faces:定義了如何使編寫Web界面
  • JAX-RS:定義了如何編寫RESTFul的接口
  • EJB:定義了如何編寫“企業Bean”
  • JPA:定義了如何編寫ORM和數據存取
  • JTA:定義了如何編寫事務相關的代碼
  • JMS:定義了如何編寫消息隊列程序
  • CDI:定義了如何編寫依賴注入
  • JAX:定義了如何編寫XML程序
  • JAX-WS: 定義了如何編寫基於XML的網絡服務,即SOAP
  • ……

看到這些,你可能機會發現,你平時其實經常使用其中一些標准接口,即便你認為你在用Spring。

什么是Spring呢?Spring最早可以追溯到2002~2004年。在那幾年作者Rod Johnson出版了兩本書:“Expert One-on-One J2EE Design and Development“和“Expert One-on-One J2EE Development without EJB“,和最初幾個版本的Springframework。

早期的Spring定位於解決J2EE在實際使用上的一系列問題,因為JavaEE的API實在是太難用了。Rod估計是趟了不少大坑,於是總結了一套最佳實踐,並總結到了一套框架里。其中最重要的,就是所謂IoC(控制反轉)。

經過多年發展,Spring發布了很多組件:

  • spring-core:Spring的Bean的管理,控制反轉和程序上下文
  • spring-mvc: web開發中的model-view-controller
  • spring-data: 數據層訪問和封裝
  • spring-boot: spring全家桶自助配置和部署管理工具
  • spring-batch:一個簡單的批處理框架
  • spring-cloud:支持與許多雲服務接口的整合
  • spring-security:認證和權限管理
  • ……

spring中其實大量使用或者實現了JavaEE標准。比如spring-mvc是在servlet基礎之上的封裝。spring本身並不提供容器,而是支持使用任何支持servlet標准的容器(如tomcat,jetty等)。spring-data也實現了JPA,通過標准接口對進行CRUD等。

歸根到底Spring只是想更好的解決實際問題。JavaEE的實現做得好的就用,做得不好的用比較恰當的方式獨立實現或者封裝。俗稱“接地氣”。

見過不少人喜歡用“JavaEE vs Spring”來提問引戰。但是,由上面的介紹可以看到JavaEE和Spring並不對立。作為開發工程師,其實還是哪個能解決問題,生態好,支持好,成本低就用哪個。而且混着用也沒有什么大的問題。

隨着時間的發展,JavaEE已經越來越落后,這是由於它的體制造成的。JavaEE的制定是由幾大巨頭定期開會協商通過,發布。然后個大容器實現廠商跟進。但這樣太慢了。互聯網的發展速度已經遠不是這樣一個僵化的體制能夠適應的。反觀Spring相對就快速的多。Spring自己就是一家公司,覺得整個社區什么東西最前沿,最急缺就立刻響應去做了。比如,Restful剛流行,你是願意等一年半載出JAX-RS標准,然后再出Jersey,才能用;還是選擇直接用Spring MVC直接就把事辦了?結果不言而喻。對解決問題的態度是二者目前境遇不同的主要原因。

最早期JavaEE是領導者,所有的技術廠商要想在這個圈子里混,必須跟着標准走。而Spring逐漸占據領導地位之后,JavaEE的一些標准反而要跟着Spring走。CDI就是一個很好的例子。Spring IoC是整個框架的核心。它解決了在Java中只能import類,卻import不了組件的問題。這個問題在js,python之類的環境中都是小菜一碟。但是Java中,如果沒有IoC,程序員就要花大量的時間寫new和set,組裝整個服務的引用關系(你不覺得這很不人道嗎?)。Spring流行之后,JavaEE在2009年才發布CDI標准。其樣子就是活脫脫的把Spring的Annotation換了個名字而已。

如果說未來的發展,我認為JavaEE早已經沒有了未來。JavaEE里那些做得很好的,或者和其他框架能夠很容易相融的標准繼續存在;那些被罵成翔的,比如JSF;或者一開始就沒有市場的,比如CDI,會成為Wiki上的一段段文字記錄。但,Spring也不一定好過。在Java體系內他也要面臨play,vert.x的沖擊;在體系外,它會受到其他語言環境的巨大壓力,如nodejs,python和go。說Spring靈活是相對於JavaEE而言。

無論標准、框架、服務,都是為了解決問題而存在,而不是如“多么的OO”,“多么的標准”,“多么的概念清晰“。哪個工具解決的好,解決的快,就用哪個。最近2~3年,docker+微服務的發展進一步的強化了這個現實。大量的新技術會隨着業務領域形成自己的生態。

這其實是好事,不是嗎?

 
https://www.zhihu.com/question/268742981


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM