在回答題主的問題以前,我先要簡單介紹一下什麼是JavaEE,什麼是Spring。node
JavaEE是一組創建在JavaSE之上的標準,解決企業級開發中的一系列問題。請特別留意,它僅僅是個標準,是對一系列接口的約定,衆多廠商圍繞這個標準作實現。如JBoss,WebSphere等。第一個版本的JavaEE 1.2在1999年被髮布,到2017年的JavaEE 8,已經經歷了將近20年。python
那麼JavaEE都有哪些標準,解決了什麼問題呢?我這裏簡單列舉一下主要的標準:程序員
看到這些,你可能機會發現,你平時其實常用其中一些標準接口,即使你認爲你在用Spring。web
什麼是Spring呢?Spring最先能夠追溯到2002~2004年。在那幾年做者Rod Johnson出版了兩本書:「Expert One-on-One J2EE Design and Development「和「Expert One-on-One J2EE Development without EJB「,和最初幾個版本的Springframework。spring
早期的Spring定位於解決J2EE在實際使用上的一系列問題,由於JavaEE的API實在是太難用了。Rod估計是趟了很多大坑,因而總結了一套最佳實踐,並總結到了一套框架裏。其中最重要的,就是所謂IoC(控制反轉)。docker
通過多年發展,Spring發佈了不少組件:spring-mvc
spring中其實大量使用或者實現了JavaEE標準。好比spring-mvc是在servlet基礎之上的封裝。spring自己並不提供容器,而是支持使用任何支持servlet標準的容器(如tomcat,jetty等)。spring-data也實現了JPA,經過標準接口對進行CRUD等。tomcat
歸根到底Spring只是想更好的解決實際問題。JavaEE的實現作得好的就用,作得很差的用比較恰當的方式獨立實現或者封裝。俗稱「接地氣」。網絡
見過很多人喜歡用「JavaEE vs Spring」來提問引戰。可是,由上面的介紹能夠看到JavaEE和Spring並不對立。做爲開發工程師,其實仍是哪一個能解決問題,生態好,支持好,成本低就用哪一個。並且混着用也沒有什麼大的問題。mvc
隨着時間的發展,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+微服務的發展進一步的強化了這個現實。大量的新技術會隨着業務領域造成本身的生態。
這實際上是好事,不是嗎?