国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
Spring 與 EJB 比較
 
Spring 與 EJB 比較
在開(kāi)源領(lǐng)域,Spring開(kāi)源框架已成為企業(yè)應(yīng)用開(kāi)發(fā)中使用最多的開(kāi)源框架。Spring框架的優(yōu)秀不但表現(xiàn)在其優(yōu)雅的底層設(shè)計(jì)、使用方便快捷、面向工作實(shí)踐、超強(qiáng)粘合能力等方面,另外一個(gè)不可忽視的方面是Spring擁有一個(gè)世界一流且活躍的技術(shù)開(kāi)發(fā)團(tuán)隊(duì)。隨著Spring的流行,于是,大家開(kāi)始對(duì)比Spring與另一種流行的框架組件EJB。目前網(wǎng)上關(guān)于Spring和EJB的爭(zhēng)論頗多。很多架構(gòu)師認(rèn)為Spring會(huì)替代EJB,也有架構(gòu)師認(rèn)為Spring是開(kāi)源的東西,是不成熟且無(wú)法和商業(yè)解決方案媲美的框架,因此,在Spring與EJB的對(duì)比過(guò)程,有若干對(duì)Spring的片面認(rèn)識(shí)。而本文希望通過(guò)對(duì)這些誤區(qū)的分析,給Spring一個(gè)原本的認(rèn)識(shí)與理解。
一、        前言
EJB 3.0框架是JCP定義的并且被所有主流J2EE提供商支持的標(biāo)準(zhǔn)框架。EJB 3.0規(guī)范的發(fā)布版本目前已經(jīng)有開(kāi)源的和商業(yè)的實(shí)現(xiàn),如JBOSS和ORACLE。EJB 3.0大量使用了JAVA注解(Java annotations,是JDK1.5提供的新功能)。
EJB最初的設(shè)計(jì)思想考慮的是為分布式的應(yīng)用服務(wù)的,分布式是針對(duì)大型應(yīng)用構(gòu)造的跨平臺(tái)的協(xié)作計(jì)算,EJB最初的目的就是為這種計(jì)算服務(wù)的。但是軟件發(fā)展到目前為止,大多數(shù)應(yīng)用不需要采用分布式的解決方案,因此用EJB顯得太臃腫了。Spring的出現(xiàn)恰恰為了解決這個(gè)問(wèn)題。舉個(gè)例子來(lái)說(shuō),EJB就是導(dǎo)彈,專門設(shè)計(jì)為打高空飛機(jī)。但是現(xiàn)在發(fā)現(xiàn)飛機(jī)不多。于是將它用來(lái)對(duì)付步兵,這個(gè)實(shí)在太糟糕了。這個(gè)時(shí)候有人發(fā)明了狙擊步槍(Spring),發(fā)現(xiàn)對(duì)付步兵太好用了。
Spring框架是一個(gè)廣受歡迎的但是非標(biāo)準(zhǔn)的開(kāi)源框架。它主要由Interface21公司開(kāi)發(fā)和控制。Spring框架的體系結(jié)構(gòu)是基于注射依賴(DI)模式。Spring框架使用了大量的XML配置文件,它可以獨(dú)立應(yīng)用,或者在現(xiàn)有的應(yīng)用服務(wù)器上工作。
這兩個(gè)框架有著一個(gè)共同的核心設(shè)計(jì)理念:它們的目標(biāo)是為松耦合的POJO類提供中間件服務(wù)??蚣芡ㄟ^(guò)在運(yùn)行時(shí)截取執(zhí)行環(huán)境,或?qū)⒎?wù)對(duì)象注射給POJO類的方式,將應(yīng)用服務(wù)和POJO類“連接”起來(lái)。POJO類本身并不關(guān)注如何“連接”,而且也很少依賴于框架。
這樣,開(kāi)發(fā)者可以將注意力集中在業(yè)務(wù)邏輯上,可以對(duì)他們的POJO類進(jìn)行與框架無(wú)關(guān)的單元測(cè)試。并且,由于POJO類不需要繼承框架的類或?qū)崿F(xiàn)框架提供的接口,開(kāi)發(fā)者可以在更加靈活性的基礎(chǔ)上構(gòu)建繼承體系,和搭建應(yīng)用。
盡管有著共同的理念,但這兩個(gè)框架采取了不同的方式來(lái)提供POJO服務(wù)。由于已經(jīng)出了大量的比較Spring和EJB3.0的文章。但發(fā)現(xiàn),隨著Spring的發(fā)展,其中對(duì)Spring的認(rèn)識(shí)難免有失偏頗的地方,因此,本文將考察它們之間幾個(gè)關(guān)鍵的認(rèn)識(shí)上的誤區(qū)進(jìn)行分析。
二、        Spring的XML VS EJB的注釋
從應(yīng)用開(kāi)發(fā)者的角度來(lái)看,Spring的編程接口主要基于XML配置文件,而EJB 3.0則大量的使用了JAVA注解。XML文件可以表達(dá)復(fù)雜的關(guān)系,但是它們更加冗長(zhǎng)而且不健壯。注解的方式很簡(jiǎn)單明了,但是很難去表達(dá)復(fù)雜的或者繼承性的結(jié)構(gòu)。
由于EJB 3.0和Spring相互學(xué)習(xí)了很多特性,所以,它們都在某種層次上支持XML和注釋。例如,EJB 3.0中可以應(yīng)用XML配置文件作為一個(gè)選擇性的機(jī)制,用來(lái)改變注釋的默認(rèn)行為。注釋也可以用來(lái)配置一些Spring服務(wù)。
在Spring 2中,采用了@PersistenceContext注釋的方式來(lái)整合JPA(Java 持久性 API),從而實(shí)現(xiàn)了EntityManager對(duì)象的注入,同時(shí)通過(guò)@Transactional實(shí)現(xiàn)聲明式事務(wù)管理。Spring 2利用注釋來(lái)支持AspectJ(一種面向切面的框架,它擴(kuò)展了Java語(yǔ)言),如@Aspect、@Before、@After、@Around等等注釋。Spring 2中,使用@Repository注釋,可以直接操作JPA或Hibernate API,而不需要使用Spring模板。
Spring的元數(shù)據(jù)模型非常的靈活的,因此在Spring中可以快速的建立起基于注釋的元數(shù)據(jù)模型。而從最近發(fā)布的Spring 2.5看來(lái),事實(shí)上也是這樣。Spring 2.5全面支持JSR-250注釋(JSR-250技術(shù)規(guī)范主要涉及J2SE和J2EE平臺(tái)上開(kāi)發(fā)普通語(yǔ)義概念的標(biāo)注,提供一種獨(dú)立技術(shù)),如@Resource、@PostConstruct、@PreDestroy、@WebServiceRef及@EJB。
特別值得一提的是@Resource,最早是為了在EJB 3使用Spring的依賴注入功能。但如今其功能已經(jīng)擴(kuò)展了,不但支持像JNDI的查找,還可以注入任何的Spring管理對(duì)象。這就把Spring的優(yōu)勢(shì)(Spring支持任何對(duì)象的依賴注入)和EJB的優(yōu)勢(shì)(使用注釋代替XML)充分的結(jié)合起來(lái)了。
Spring 2.5中提供了完整的基于注釋的依賴注入模型,如@Autowired及@Qualifier注釋。用戶通過(guò)@Autowired注解來(lái)對(duì)Bean的屬性變量、屬性Setter方法以及構(gòu)造函數(shù)進(jìn)行標(biāo)注,配合AutowiredAnnotationBeanPostProcessor完成對(duì)Bean的自動(dòng)裝配。
@Component注釋為用戶自定義原形進(jìn)行了擴(kuò)展。Spring可以自動(dòng)的檢測(cè)到注釋的組件。例如下面的代碼
<context:component-scan base-package="org.springframework.samples.petclinic.web" />
Web控制器不需要額外的XML配置,因?yàn)槭褂昧嘶谧⑨尩囊蕾囎⑷胍约盎谧⑨尩恼?qǐng)求映射。Web控制器通過(guò)如下的代碼進(jìn)行管理:
@Controller
public class ClinicController {
private final Clinic clinic;
@Autowired
public ClinicController(Clinic clinic) {
this.clinic = clinic;
}
三、        EJB使用JPA,Spring使用Hibernate
很多人都認(rèn)為,在EJB 3中通過(guò)使用@PersistenceContext注釋提供的entityManager對(duì)象來(lái)獲得JPA的數(shù)據(jù)訪問(wèn),而在Spring中,通過(guò)對(duì)SessionFactory對(duì)象的注入獲得Hibernate數(shù)據(jù)訪問(wèn)。從而自然而然地認(rèn)中,EJB使用JPA來(lái)操作數(shù)據(jù)對(duì)象,而Spring使用Hibernate來(lái)操作數(shù)據(jù)對(duì)象。
作為EJB3.0的一部分,JPA是一個(gè)好東西。其簡(jiǎn)單的配置方式及強(qiáng)大的默認(rèn)配置支持,使其可以輕松自由的存在于輕量與重量之間。事實(shí)上,Spring同樣支持使用JPA來(lái)操作數(shù)據(jù)對(duì)象(例如JpaTemplate),此外Spring提供了@PersistenceContext注釋來(lái)支持JPA。在輕量級(jí) Spring 框架的第二代中添加了一大批特性,即使是新的服務(wù)器應(yīng)用程序開(kāi)發(fā)人員也能夠輕松上手。其關(guān)鍵增強(qiáng)之一就是 Spring 2 與JPA的集成。@PersistenceContext注釋的使用示例如下面的代碼所示:
package quickstart.service;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;
import quickstart.model.Person;
@Transactional
public class PersonServiceImpl implements PersonService {
     private EntityManager em;
     @PersistenceContext
     public void setEntityManager(EntityManager em) {
         this.em = em;
     }
     @SuppressWarnings("unchecked")
     public List<Person> findAll() {
         Query query = getEntityManager().createQuery("select p FROM Person p");
         return query.getResultList();
     }
     public void save(Person person) {
         if (person.getId() == null) {
             // new
             em.persist(person);
         } else {
             // update
             em.merge(person);
         }
     }
     public void remove(int id) {
         Person person = find(id);
         if (person != null) {
             em.remove(person);
         }
     }
     private EntityManager getEntityManager() {
         return em;
     }
     public Person find(int id) {
         return em.find(Person.class, id);
     }
}
@PersistenceContext會(huì)讓Spring在實(shí)例化的時(shí)候給服務(wù)注入一個(gè)EntityManager。@PersistenceContext注解可以放在實(shí)例變量,或者setter方法前面。如果一個(gè)類被注解為@Transactional,Spring將會(huì)確保類的方法在運(yùn)行在一個(gè)事務(wù)中。
當(dāng) Spring JPA 應(yīng)用程序在 Tomcat 上運(yùn)行時(shí),要讓 JPA 支持正常工作,需要在類裝入期間進(jìn)行字節(jié)碼“連接”。來(lái)自 Tomcat 的標(biāo)準(zhǔn)類裝入器不支持這個(gè),需要用特定于 Spring 的類裝入器實(shí)現(xiàn)這個(gè)功能。要把這個(gè)特定于 Spring 的類裝入器安裝到 Tomcat 服務(wù)器,首先要把 spring-tomcat-weaver.jar 拷貝到 Tomcat 的 server/lib 子目錄。這個(gè)目錄包含的庫(kù)屬于 Tomcat 服務(wù)器私有,可以在 Spring 2 下載的 dist/weaver 目錄下找到 spring-tomcat-weaver.jar 庫(kù)。
四、        提供商無(wú)關(guān)性
開(kāi)發(fā)者選擇JAVA平臺(tái)的一個(gè)最重要的原因就是它的提供廠商無(wú)關(guān)性。EJB 3.0是一個(gè)被設(shè)計(jì)為對(duì)提供商沒(méi)有依賴性的開(kāi)放的標(biāo)準(zhǔn)。EJB 3.0規(guī)范由企業(yè)JAVA社區(qū)的主流開(kāi)源組織和廠商共同編寫和支持的。EJB 3.0框架使開(kāi)發(fā)者的應(yīng)用程序?qū)崿F(xiàn)可以獨(dú)立于應(yīng)用服務(wù)器。
比如,JBoss的EJB 3.0的實(shí)現(xiàn)是基于Hibernate的,Oracle的EJB 3.0實(shí)現(xiàn)是基于TopLink的,但是,在JBoss或者Oracle上跑應(yīng)用程序,開(kāi)發(fā)者既不需要去學(xué)習(xí)Hibernate,也不需要學(xué)習(xí)TopLink提供的獨(dú)特API。廠商無(wú)關(guān)性使EJB 3.0框架區(qū)別于當(dāng)前其他任何的POJO中間件框架。
很多人認(rèn)為,盡管在任何應(yīng)用服務(wù)器都上可以使用Spring框架,但基于Spring的應(yīng)用仍然被限制于Spring本身,以及在應(yīng)用中使用到的Spring提供的各種特別服務(wù)。但事實(shí)上是不是如此呢?大家應(yīng)該知道,Spring的應(yīng)用程序中,JtaTransactionManager使用了自動(dòng)檢測(cè)機(jī)制,不管是MBeans應(yīng)用服務(wù)器還是Tomcat應(yīng)用服務(wù)器。同理,當(dāng)使用JPA時(shí),Spring自動(dòng)檢測(cè)persistence.xml文件,并且創(chuàng)建EntityManagerFactory對(duì)象。在上面這些機(jī)制中,Spring不管是采用注釋(如PersistenceContext、@Transactional、@Resource等等)還是采用XML(如”jee:indi-lookup”等等),都可以像EJB應(yīng)用一樣的與應(yīng)用服務(wù)器提供商無(wú)關(guān)。
五、        小結(jié)
筆者認(rèn)為,EJB和Spring設(shè)計(jì)的角度根本不同,就目前來(lái)看,還不能說(shuō)哪一個(gè)能完全打倒另外一個(gè)。首先EJB最初的設(shè)計(jì)思想考慮的是為分布式的應(yīng)用服務(wù)的。就因?yàn)檫@個(gè)原因,使得開(kāi)發(fā)一個(gè)EJB不難,但是開(kāi)發(fā)一個(gè)好的EJB卻非常難。此外對(duì)于中小型的應(yīng)用項(xiàng)目而言,基本不采用分布式的解決方案,那么為什么要采取一個(gè)為分布式設(shè)計(jì)的方案來(lái)解決非分布式的問(wèn)題呢? Spring就是為了解決這個(gè)問(wèn)題而誕生的。
本文中,筆者希望比較客戶的評(píng)價(jià)Spring相對(duì)EJB所具有的一些特性,同時(shí),Spring可以與EJB進(jìn)行協(xié)同的工作,Spring可以應(yīng)用到EJB應(yīng)用中去,同樣,EJB可以在Spring應(yīng)用中很好的使用。同時(shí),Spring如今有力的支持注釋:@Resource、@PersistenceContext、@PostConstruct、@PreDestroy、@EJB及@WebServiceRef。當(dāng)然,Spring 中不只是能使用Hibernate這樣的ORM框架,同樣可以使用JPA。更妙的是,Spring越來(lái)越與應(yīng)用服務(wù)器提供商無(wú)關(guān)了,很容易實(shí)現(xiàn)在不同的應(yīng)用服務(wù)中進(jìn)行移植。

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zhrl0000/archive/2009/12/17/5028060.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java開(kāi)發(fā)過(guò)程的前世今生(什么是J2EE、EJB、pojo、spring)
POJO應(yīng)用架構(gòu):Spring與EJB 3.0的對(duì)比
EJB3.0和Spring比較
Spring 2 和 JPA 簡(jiǎn)介
探討Spring框架使用真相
Java企業(yè)系統(tǒng)架構(gòu)選擇考量
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服