http://blog.csdn.net/jnqqls/article/details/17723417java
經過對EJB系列的總結和學習咱們已經對EJB有了基本的瞭解,可是爲了更進一步的去深刻學習EJB,咱們頗有必要將它拿出來跟以前很是熟悉的spring進行一下對比,經過對比來了解這兩個內容的相同與不一樣之處,更有利於咱們對二者進行深刻的瞭解.mysql
咱們都有過這樣的經歷,在開發應用程序的時候,選擇哪一個技術是比較有學問的.在我最近的面試過程當中也有不少問道關於技術選型的問題,舉一個比較典型的例子好比:爲何大家的系統要選擇EJB3.0而不選用Spring或者爲何選擇Spring不選擇EJB等.面試
通常而言咱們會針對特定的問題會採用哪一種技術可以最有效的解決它?這樣的決定並非很輕易的就能作出來的.咱們須要瞭解各自的優點和劣勢.接下來咱們將會對Spring和EJB進行一系列的對比.spring
咱們首先須要瞭解的一個概念是Spring是一個具體的實現,而EJB3.0是J2EE的規範,這是大的概念上的不一樣.可是在具體的一些地方他們兩個又有着許多的共同點.例如,他們都提供把中間件服務傳遞到 Java 應用。若是看一下歷史會更清楚明瞭一些,Spring 被開發出來就是爲了反對 EJB ,固然,那時候的EJB2的確有着自身不少的不足,可是隨着新版本的 EJB 發佈, EJB3.0 究竟克服了之前版本的一些缺點,而且借鑑了Spring的相關內容.sql
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。oracle
關於輕量級和重量級框架
輕量級框架和重量級框架解決問題的側重點是不一樣的。
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