电竞比分网-中国电竞赛事及体育赛事平台

分享

POJO和JavaBean的區(qū)別和聯(lián)系

 bylele 2013-09-06

POJO 和JavaBean是我們常見的兩個(gè)關(guān)鍵字,一般容易混淆,POJO全稱是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻譯成:普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO,但是JavaBean則比 POJO復(fù)雜很多, Java Bean 是可復(fù)用的組件,對(duì) Java Bean 并沒有嚴(yán)格的規(guī)范,理論上講,任何一個(gè) Java 類都可以是一個(gè) Bean 。但通常情況下,由于 Java Bean 是被容器所創(chuàng)建(如 Tomcat) 的,所以 Java Bean 應(yīng)具有一個(gè)無參的構(gòu)造器,另外,通常 Java Bean 還要實(shí)現(xiàn) Serializable 接口用于實(shí)現(xiàn) Bean 的持久性。 Java Bean 是不能被跨進(jìn)程訪問的

JavaBean是一種組件技術(shù),就好像你做了一個(gè)扳子,而這個(gè)扳子會(huì)在很多地方被拿去用,這個(gè)扳子也提供多種功能(你可以拿這個(gè)扳子扳、錘、撬等等),而這個(gè)扳子就是一個(gè)組件。
一般在web應(yīng)用程序中建立一個(gè)數(shù)據(jù)庫的映射對(duì)象時(shí),我們只能稱它為POJO。


POJO(Plain Old Java Object)這個(gè)名字用來強(qiáng)調(diào)它是一個(gè)普通java對(duì)象,而不是一個(gè)特殊的對(duì)象。2005年11月時(shí),“POJO”主要用來指代那些沒用遵從特定的Java對(duì)象模型,約定或框架如EJB的Java對(duì)象.理想地講,一個(gè)POJO是一個(gè)不受任何限制的Java對(duì)象(除了Java語言規(guī)范)。例如一個(gè)POJO不應(yīng)該是
  1. 擴(kuò)展預(yù)定的類,如       public class Foo extends javax.servlet.http.HttpServlet { ...
  2. 實(shí)現(xiàn)預(yù)定的接口,如   public class Bar implements javax.ejb.EntityBean { ...
  3. 包含預(yù)定的標(biāo)注,如   @javax.ejb.Entity public class Baz{ ...
然后,因?yàn)榧夹g(shù)上的困難及其他原因,許多兼容POJO風(fēng)格的軟件產(chǎn)品或框架事實(shí)上仍然要求使用預(yù)定的標(biāo)注,譬如用于更方便的持久化。 JavaBean 是一種JAVA語言寫成的可重用組件。它的方法命名,構(gòu)造及行為必須符合特定的約定:
  1. 這個(gè)類必須有一個(gè)公共的缺省構(gòu)造函數(shù)。
  2. 這個(gè)類的屬性使用getter和setter來訪問,其他方法遵從標(biāo)準(zhǔn)命名規(guī)范。
  3. 這個(gè)類應(yīng)是可序列化的。 
因?yàn)檫@些要求主要是靠約定而不是靠實(shí)現(xiàn)接口,所以許多開發(fā)者把JavaBean看作遵從特定命名約定的POJO。 簡(jiǎn)而言之,當(dāng)一個(gè)Pojo可序列化,有一個(gè)無參的構(gòu)造函數(shù),使用getter和setter方法來訪問屬性時(shí),他就是一個(gè)JavaBean。

我的整理與總結(jié): 一、對(duì)于java bean,就是一個(gè)java模型組件,他為使用java類提供了一種標(biāo)準(zhǔn)的格式,在用戶程序和可視化管理工具中可以自動(dòng)獲得這種具有標(biāo)準(zhǔn)格式的類的信息,并能夠創(chuàng)建和管理這些類。  java bean 可以使應(yīng)用程序更加面向?qū)ο?,可以把?shù)據(jù)封裝起來,把應(yīng)用的業(yè)務(wù)邏輯和顯示邏輯分離開,降低了開發(fā)的復(fù)雜程度和維護(hù)成本! JavaBean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,并且具有無參數(shù)的構(gòu)造器。JavaBeans 通過提供符合一致性設(shè)計(jì)模式的公共方法將內(nèi)部域暴露稱為屬性。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過自省機(jī)制發(fā)現(xiàn)和操作這些JavaBean 屬性。
從編程的角度,也就是最基本的實(shí)現(xiàn)了get跟set方法的類。
二、Enterprise Bean,也就是Enterprise JavaBean(EJB),是J2EE的一部分,定義了一個(gè)用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn)。其特點(diǎn)包括網(wǎng)絡(luò)服務(wù)支持和核心開發(fā)工具(SDK)。    在 J2EE里,Enterprise Java Beans(EJB)稱為Java 企業(yè)Bean,是Java的核心代碼,分別是會(huì)話 Bean(Session Bean),實(shí)體Bean(Entity Bean)和消息驅(qū)動(dòng)Bean(MessageDriven Bean)。      1.Session Bean用于實(shí)現(xiàn)業(yè)務(wù)邏輯,它可以是有狀態(tài)的,也可以是無狀態(tài)的。每當(dāng)客戶端請(qǐng)求時(shí),容器就會(huì)選擇一個(gè)Session Bean來為客戶端服務(wù)。Session Bean可以直接訪問數(shù)據(jù)庫,但更多時(shí)候,它會(huì)通過Entity Bean實(shí)現(xiàn)數(shù)據(jù)訪問。 這個(gè)類一般用單例模式來實(shí)現(xiàn),因?yàn)槊看芜B接都需要用到它。     2.Entity Bean是域模型對(duì)象, 用于實(shí)現(xiàn)O/R映射,負(fù)責(zé)將數(shù)據(jù)庫中的表記錄映射為內(nèi)存中的Entity對(duì)象,事實(shí)上,創(chuàng)建一個(gè)Entity Bean對(duì)象相當(dāng)于新建一條記錄,刪除一個(gè) Entity Bean會(huì)同時(shí)從數(shù)據(jù)庫中刪除對(duì)應(yīng)記錄,修改一個(gè)Entity Bean時(shí),容器會(huì)自動(dòng)將Entity Bean的狀態(tài)和數(shù)據(jù)庫同步。       Java Persistence 1.0規(guī)范中的entity bean僅作為普通Java對(duì)象(POJO)來使用,并且是映射到關(guān)系數(shù)據(jù)庫表的。與其他類型的EJB不同,entity bean可以被分配,序列化,并像任何其他POJO那樣通過網(wǎng)絡(luò)被發(fā)送出去。     3.MessageDriven Bean是EJB2.0中引入的新的企業(yè)Bean,它基于JMS消息,只能接收客戶端發(fā)送的JMS消息然后處理。MDB實(shí)際上是一個(gè)異步的無狀態(tài)Session Bean,客戶端調(diào)用MDB后無需等待,立刻返回,MDB將異步處理客戶請(qǐng)求。這適合于需要異步處理請(qǐng)求的場(chǎng)合,比如訂單處理,這樣就能避免客戶端長(zhǎng)時(shí)間的等待一個(gè)方法調(diào)用直到返回結(jié)果。     三、Enterprise Bean 與 JavaBean的區(qū)別 最 初,JavaBean的目的是為了將可以重復(fù)使用的軟件代碼打包標(biāo)準(zhǔn)。特別是用與幫助廠家開發(fā)在綜合開發(fā)環(huán)境(IDE)下使用的java軟件部件。這些包 括如Grid控件,用戶可以將該部件拖放到開發(fā)環(huán)境中。從此,JavaBean就可以擴(kuò)展為一個(gè)java web 應(yīng)用的標(biāo)準(zhǔn)部件,并且JavaBean部件框架已經(jīng)擴(kuò)展為企業(yè)版的 Bean(EJB)。    JavaBean 和 Server Bean(通常稱為 Enterprise JavaBean (EJB))有一些基本相同之處。它們都是用一組特性創(chuàng)建,以執(zhí)行其特定任務(wù)的對(duì)象或組件。它們還有從當(dāng)前所駐留服務(wù)器上的容器獲得其它特性的能力。這使 得 bean 的行為根據(jù)特定任務(wù)和所在環(huán)境的不同而有所不同。 JavaBean 是使用 java.beans 包開發(fā)的,它是 Java 2 標(biāo)準(zhǔn)版的一部分。JavaBean 是一臺(tái)機(jī)器上同一個(gè)地址空間中運(yùn)行的組件。JavaBean 是進(jìn)程內(nèi)組件。Enterprise Bean 是使用 javax.ejb 包開發(fā)的,它是標(biāo)準(zhǔn) JDK 的擴(kuò)展,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多臺(tái)機(jī)器上跨幾個(gè)地址空間運(yùn)行的組件。因此 Enterprise Bean 是進(jìn)程間組件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 則用作分布式商業(yè)對(duì)象.   四、POJO一個(gè)正規(guī)的Java對(duì)象(不是JavaBean,EntityBean等),也不擔(dān)當(dāng)任何的特殊的角色,也不實(shí)現(xiàn)任何Java框架指定的接口。POJO是一個(gè)簡(jiǎn)單的、正規(guī)Java對(duì)象,它包含業(yè)務(wù)邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不繼承或不實(shí)現(xiàn)任何其它Java框架的類或接口。  POJO 應(yīng)該不是我們開始認(rèn)為的JavaBean,當(dāng)然更不是EJB,它不應(yīng)該依賴于框架即繼承或?qū)崿F(xiàn)某些框架類或接口。例如:Struts1中的Action和 ActionForm當(dāng)然不屬于POJO了,而在Struts2中的Action由于可以不繼承任何的接口,所以在這種情況下Action是POJO,但 是Struts2中的Action也可以繼承ActionSupport類就不再屬于POJO了。POJO里面是可以包含業(yè)務(wù)邏輯處理和持久化邏輯,也可 以包含類似與JavaBean屬性和對(duì)屬性訪問的set和get方法的。    在百度百科上的解釋是:簡(jiǎn) 單的Java對(duì)象(Plain Ordinary Java Objects)實(shí)際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來, 而且簡(jiǎn)稱比較直接. 其中有一些屬性及其getter setter方法的類,有時(shí)可以作為value object或dto(Data Transform Object)來使用.當(dāng)然,如果你有一個(gè)簡(jiǎn)單的運(yùn)算屬性也是可以的,但不允許有業(yè)務(wù)方法,也不能攜帶有connection之類的方法。 

   POJO是Plain Ordinary Java Objects的縮寫不錯(cuò),但是它通指沒有使用Entity Beans的普通java對(duì)象,可以把POJO作為支持業(yè)務(wù)邏輯的協(xié)助類。 而我的理解是:POJO 跟Entity Bean的區(qū)別僅在于Entity Bean必須要映射到數(shù)據(jù)庫里,而POJO僅用于業(yè)務(wù)邏輯,當(dāng)然也可以映射到數(shù)據(jù)庫中,也就是Entity Bean是POJO的特例,當(dāng)然它們是不同的標(biāo)準(zhǔn)中的,個(gè)人認(rèn)為Entity Bean是基于POJO的,不知道對(duì)不對(duì)?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多