http://blog.csdn.net/jnqqls/article/details/17723417 通過對EJB系列的總結和學習我們已經對EJB有了基本的瞭解,但是為了更進一步的去深入學習EJB,我們很有必要將它拿出來跟之前非常熟悉的spring進行一下對比,通過對比來瞭解這兩個內容的相同與不 ...
http://blog.csdn.net/jnqqls/article/details/17723417
通過對EJB系列的總結和學習我們已經對EJB有了基本的瞭解,但是為了更進一步的去深入學習EJB,我們很有必要將它拿出來跟之前非常熟悉的spring進行一下對比,通過對比來瞭解這兩個內容的相同與不同之處,更有利於我們對兩者進行深入的瞭解.
我們都有過這樣的經歷,在開發應用程式的時候,選擇哪個技術是比較有學問的.在我最近的面試過程中也有很多問道關於技術選型的問題,舉一個比較典型的例子比如:為什麼你們的系統要選擇EJB3.0而不選用Spring或者為什麼選擇Spring不選擇EJB等.
一般而言我們會針對特定的問題會採用哪種技術能夠最有效的解決它?這樣的決定並不是很輕易的就能做出來的.我們需要瞭解各自的優勢和劣勢.接下來我們將會對Spring和EJB進行一系列的對比.
我們首先需要瞭解的一個概念是Spring是一個具體的實現,而EJB3.0是J2EE的規範,這是大的概念上的不同.但是在具體的一些地方他們兩個又有著許多的共同點.例如,他們都提供把中間件服務傳遞到 Java 應用。如果看一下歷史會更清楚明瞭一些,Spring 被開發出來就是為了反對 EJB ,當然,那時候的EJB2的確有著自身很多的不足,但是隨著新版本的 EJB 發佈, EJB3.0 究竟剋服了以前版本的一些缺點,並且借鑒了Spring的相關內容.
Spring和EJB他們各自都提供了那些功能?從這個最直接的問題入手能夠直觀的看到他們各自的特點.Spring定義成分層的J2EE應用框架.EJB則是針對面向對象,分散式的企業級應用開發和部署組件架構.一個是框架,一個是架構.框架更多的是實現,而架構更多的是定義.
關於數據持久化
關於數據持久化這一個關鍵的部分,Spring和EJB3.0都對其提供了良好的支持。Spring把眾多流行的持久化框架集成進來,包括JDBC、hibernate、JDO、iBatis和JPA。EJB3.0的出現將實體bean用JPA取代。JPA致力於提供一個簡單的、輕量級的OR映射框架。這個規範定義了兩個介面,一個用於在persistence provider間交互,另一個用於在實體和關係資料庫之間建立映射。
在EJB3中通過使用@PersistenceContext註釋提供的entityManager對象來獲得JPA的數據訪問,而在Spring中,通過對SessionFactory對象的註入獲得Hibernate數據訪問。我們很多人會預設為EJB使用JPA來操作數據對象,而Spring使用Hibernate來操作數據對象。但實際上,Spring同樣支持使用JPA來操作數據對象,並且Spring可以通過@PersistenceContext註釋來支持JPA。
關於輕量級和重量級
輕量級框架和重量級框架解決問題的側重點是不同的。
Spring為代表的輕量級框架側重於減小開發的複雜度,相應的它的處理能力便有所減弱(比較適用於開發中小型企業應用。採用輕量框架一方面因為儘可能的採用基於POJOs的方法進行開發,使應用不依賴於任何容器,這可以提高開發調試效率;另一方面輕量級框架多數是開源項目,開源社區提供了良好的設計和許多快速構建工具以及大量現成可供參考的開源代碼,這有利於項目的快速開發。
而作為重量級框架EJB強調高可伸縮性,適合與開發大型企業應用。在EJB體繫結構中,一切與基礎結構服務相關的問題和底層分配問題都由應用程式容器或伺服器來處理,且EJB容器通過減少資料庫訪問次數以及分散式處理等方式提供了專門的系統性能解決方案,能夠充分解決系統性能問題。
輕量級框架的產生並非是對重量級框架的否定,甚至在某種程度上可以說二者是互補的。輕量級框架在努力發展以開發具有更強大,功能更完備的企業應用;而新的EJB規範EJB3.0則在努力簡化J2EE的使用以使得EJB不僅僅是擅長處理大型企業系統,也利用開發中小型系統,這也是EJB輕量化的一種努力。對於大型企業應用以及將來可能涉及到能力擴展的中小型應用採用結合使用輕量級框架和重量級框架也不失為一種較好的解決方案。
提供商無關性
開發者選擇JAVA平臺的一個最重要的原因就是它的提供廠商無關性。EJB3.0是一個被設計為對提供商沒有依賴性的開放的標準。EJB 3.0規範由企業JAVA社區的主流開源組織和廠商共同編寫和支持的。EJB3.0框架使開發者的應用程式實現可以獨立於應用伺服器。
比如,JBoss的EJB3.0的實現是基於Hibernate的,Oracle的EJB3.0實現是基於TopLink的,但是,在JBoss或者Oracle上跑應用程式,開發者既不需要去學習Hibernate,也不需要學習TopLink提供的獨特API。廠商無關性使EJB3.0框架區別於當前其他任何的POJO中間件框架。
很多人認為,儘管在任何應用伺服器都上可以使用Spring框架,但基於Spring的應用仍然被限制於Spring本身,以及在應用中使用到的Spring提供的各種特別服務。但事實上是不是如此呢?大家應該知道,Spring的應用程式中,JtaTransactionManager使用了自動檢測機制,不管是MBeans應用伺服器還是Tomcat應用伺服器。同理,當使用JPA時,Spring自動檢測persistence.xml文件,並且創建EntityManagerFactory對象。在上面這些機制中,Spring不管是採用註釋還是採用XML,都可以像EJB應用一樣的與應用伺服器提供商無關。
參考文章:Make the Right Decision with Our Side-by-Side Comparison of Springand EJB 3.0