1. 程式人生 > >什麼是JavaBean、bean? 什麼是POJO、PO、DTO、VO、BO ? 什麼是EJB、EntityBean?

什麼是JavaBean、bean? 什麼是POJO、PO、DTO、VO、BO ? 什麼是EJB、EntityBean?

什麼是JavaBeanbean 什麼是POJO、PO、DTO、VO、BO ?  什麼是EJB、EntityBean?
前言: 在Java開發中經常遇到這些概念問題,有的可能理解混淆,有的可能理解不到位,特此花了很多時間理順了這些概念。不過有些概念實際開發中並沒有使用到,可能理解還不夠準確,只能靠後續不斷糾正了。 什麼是POJO ? POJO(Plain Old Java Object)這種叫法是Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次演講的時候提出來的。 按照Martin Fowler的解釋是“Plain Old Java Object”,從字面上
翻譯為“純潔老式的Java物件”,但大家都使用“簡單java物件”來稱呼它。POJO的內在含義是:那些沒有繼承任何類、也沒有實現任何介面,更沒有被其它框架侵入的java物件。
先給一個定義吧: POJO是一個簡單的、普通Java物件,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不繼承或不實現任何其它Java框架的類或介面。可以包含類似與JavaBean屬性和對屬性訪問的setter和getter方法的。 POJO(Plain Old Java Object)這個名字用來強調它是一個普通java物件,而不是一個特殊的物件
2005年11月時,“POJO”主要用來指代那些沒用遵從特定的Java物件模型,約定或框架如EJB的Java物件
理想地講,一個POJO是一個不受任何限制的Java物件(除了Java語言規範)。例如一個POJO不應該是    1. 擴充套件預定的類,如       public class Foo extends javax.servlet.http.HttpServlet { ...    2. 實現預定的介面,如   public class Bar implements javax.ejb.EntityBean { ...    3. 包含預定的標註,如   @javax.ejb.Entity public class Baz{ ...
然後,因為技術上的困難及其他原因,許多相容POJO風格的軟體產品或框架事實上仍然要求使用預定的標註,譬如用於更方便的持久化。 一般在web應用程式中建立一個數據庫的對映物件時,我們只能稱它為POJO ------------------------------------ 正確官方理解思路: 我在做Java EE培訓中,發現我的很多學生問我什麼是POJO,後來我在寫書的時候發現POJO這個概念無法迴避。現在網上對於POJO的解釋很多,但是很多都是有錯誤的或者不夠準確。 對此我一開始也是存在誤區的,我原來是這樣理解的: POJO是這樣的一種“純粹的”JavaBean,在它裡面除了JavaBean規範的方法和屬性沒有別的東西,即private屬性以及對這個屬性方法的public的get和set方法。我們會發現這樣的JavaBean很“單純”,它只能裝載資料,作為資料儲存的載體,而不具有業務邏輯處理的能力。所以下面的程式碼被認為是POJO了。  package com.demo.spring; public class DbHello implements Hello //實現了介面,就不能稱之為POJO,這已經不是簡單的Java類了      private DictionaryDAO dao;      public void setDao(DictionaryDAO dao) {             this.dao = dao;      } }        其實,這樣的認為是錯誤的,我仔細閱讀了《POJOs in Action》這本書的有關部分和POJO的最原始的出處http://martinfowler.com/bliki/POJO.html,    The term was coined while Rebecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000.      In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans.We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it''s caught on very nicely.     基本的意思是,將業務邏輯寫規則的Java物件(regular java objects)中,比使用Entity Beans更有好處。另外,我們要給具有業務邏輯處理的規則的Java物件(regular java objects)起了一個名字——POJO,這些Java物件不是EntityBeans(EJB規範中專門用於封裝資料庫訪問的一種元件,以面向物件的方式進行資料庫的訪問)。    我又在http://www.webopedia.com/TERM/P/POJO.htm查到解釋如下:    POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.)  and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a "fancy name", thereby convincing people that they were worthy of use.    基本意思是說POJO一個普通的Java物件(不是JavaBean,EntityBean等),也不擔當任何的特殊的角色,也不實現任何Java框架指定的介面。  我覺得上面的解釋很準確,POJO應該不是我們開始認為的JavaBean,當然更不是EJB,它不應該依賴於框架(即繼承或實現某些框架類或介面)。總之,POJO就是一個很簡單的Java類,沒那麼多複雜的東西。例如:Struts1中的Action和ActionForm當然不屬於POJO了,而在Struts2中的Action由於可以不繼承任何的介面,所以在這種情況下Action是POJO,但是Struts2中的Action也可以繼承ActionSupport類就不再屬於POJO了。POJO裡面是可以包含業務邏輯處理和持久化邏輯,也可以包含類似與JavaBean屬性和對屬性訪問的set和get方法的。    最後,我們總結一下給一個定義把,POJO是一個簡單的、普通Java物件,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不繼承或不實現任何其它Java框架的類或介面。 ◇輔助理解:POJO可以認為是一箇中間物件: 一箇中間物件,可以轉化為PO、DTO、VO 1 .POJO持久化之後==〉PO (在執行期,由Hibernate中的cglib動態把POJO轉換為PO,PO相對於POJO會增加一些用來管理資料庫entity狀態的屬性和方法。PO對於programmer來說完全透明,由於是執行期生成PO,所以可以支援增量編譯,增量除錯。) 2 .POJO傳輸過程中==〉DTO 3 .POJO用作表示層==〉VO 什麼是JavaBean? JavaBean實際上是指一種特殊的Java類,它通常用來實現一些比較常用的簡單功能,並可以很容易的被重用或者是插入其他應用程式中去。所有遵循“一定程式設計原則”的Java類都可以被稱作JavaBean。 JavaBean是一個遵循特定寫法的Java類,是一種Java語言編寫的可重用元件,它的方法命名,構造及行為必須符合特定的約定: 1、這個類必須具有一個公共的(public)無參建構函式;
2、所有屬性私有化(private);
3、私有化的屬性必須通過public型別的方法(getter和setter)暴露給其他程式,並且方法的命名也必須遵循一定的命名規範。 
4、這個類應是可序列化的。(比如可以實現Serializable 介面,用於實現bean的永續性)
JavaBean在Java EE開發中,通常用於封裝資料,對於遵循以上寫法的JavaBean元件,其它程式可以通過反射技術例項化JavaBean物件(內省機制),並且通過反射那些遵循命名規範的方法,從而獲知JavaBean的屬性,進而呼叫其屬性儲存資料。 因為這些要求主要是靠約定而不是靠實現介面,所以許多開發者把JavaBean看作遵從特定命名約定的POJO。(可以這麼理解,POJO按JavaBean的規則來,就可以變成JavaBean)。
簡而言之,當一個POJO可序列化,有一個無參的建構函式,使用getter和setter方法來訪問屬性時,他就是一個JavaBean。(沒毛病!) ------------------------------------ JavaBean是一種元件技術,就好像你做了一個扳手,而這個扳手會在很多地方被拿去用,這個扳子也提供多種功能(你可以拿這個扳手扳、錘、撬等等),而這個扳手就是一個元件。 對於JavaBean,就是一個Java模型元件,他為使用Java類提供了一種標準的格式,在使用者程式和視覺化管理工具中可以自動獲得這種具有標準格式的類的資訊,並能夠建立和管理這些類。 
JavaBean可以使應用程式更加面向物件,可以把資料封裝起來,把應用的業務邏輯和顯示邏輯分離開,降低了開發的複雜程度和維護成本!
JavaBean 是一種JAVA語言寫成的可重用元件。為寫成JavaBean,類必須是具體的和公共的,並且具有無引數的構造器。JavaBeans 通過提供符合一致性設計模式的公共方法將內部域暴露稱為屬性。眾所周知,
屬性名稱符合這種模式,其他Java 類可以通過內省機制發現和操作這些JavaBean 屬性 通常情況下,由於 Java Bean 是被容器所建立(如 Tomcat) 的,所以 Java Bean 應具有一個無參的構造器,另外,通常 Java Bean 還要實現 Serializable 介面用於實現 Bean 的永續性。 Java Bean 是不能被跨程序訪問的。
JavaBean 是使用 java.beans 包開發的,它是 Java 2 標準版的一部分。JavaBean 是一臺機器上同一個地址空間中執行的元件。JavaBean 是程序內元件。
什麼是Bean? Bean的中文含義是“豆子”,Bean的含義是可重複使用的Java元件。所謂元件就是一個由可以自行進行內部管理的一個或幾個類所組成、外界不瞭解其內部資訊和執行方式的群體。使用它的物件只能通過介面來操作。
Bean並不需要繼承特別的基類(BaseClass)或實現特定的介面(Interface)。Bean的編寫規範使Bean的容器(Container)能夠分析一個Java類檔案,並將其方法(Methods)翻譯成屬性(Properties),即把Java類作為一個Bean類使用。Bean的編寫規範包括Bean類的構造方法、定義屬性和訪問方法編寫規則。
Java Bean是基於Java的元件模型,由屬性、方法和事件3部分組成。在該模型中,JavaBean可以被修改或與其他元件結合以生成新元件或完整的程式。它是一種Java類,通過封裝成為具有某種功能或者處理某個業務的物件。因此,也可以通過嵌在JSP頁面內的Java程式碼訪問Bean及其屬性。
什麼是EJB 、Entity Bean Enterprise Bean,也就是Enterprise JavaBean(EJB),是J2EE的一部分,定義了一個用於開發基於元件的企業多重應用程式的標準。其特點包括網路服務支援和核心開發工具(SDK)。 在 J2EE裡,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心程式碼,分別是會話 Bean(Session Bean),實體Bean(Entity Bean)和訊息驅動Bean(MessageDriven Bean)。  1.Session Bean用於實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問資料庫,但更多時候,它會通過Entity Bean實現資料訪問。 這個類一般用單例模式來實現,因為每次連線都需要用到它。 2.Entity Bean是域模型物件,用於實現O/R對映,負責將資料庫中的表記錄對映為記憶體中的Entity物件,事實上,建立一個Entity Bean物件相當於新建一條記錄,刪除一個 Entity Bean會同時從資料庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和資料庫同步。  Enterprise Bean 是使用 javax.ejb 包開發的,它是標準 JDK 的擴充套件,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多臺機器上跨幾個地址空間執行的元件。因此 Enterprise Bean 是程序間元件。
我們一般所熟悉的tomcat僅僅只實現了j2ee的一小部分規範,它只是一個serlvet的容器(Web)容器,它不能跑J2EE的程式,EJB說到底也是種規範,它是j2EE下面的一個子分類(核心類),所以j2ee包含EJB,同時我們都可以說JBOSS,Weblogic,WebSphere是J2EE容器,也可以叫EJB容器。因為它們能跑EJB元件。那麼什麼是EJB元件呢?其實就是java寫出來的一段程式被打包成EAR包,這個EAR包放在某個EJB的容器的特定目錄下啟動就可以跑了。類似於網際網路公司經常使用的WAR包(部署在tomcat上)。
然後要說的是EJB是一種是很老、很繁瑣的技術標準(規範)了,現如今基本已經被淘汰了。因為EJB的繁瑣、難用,spring的出現徹底革了EJB的命,不然怎麼說是Java的春天(spring)來了呢。 EJB實現原理: 就是把原來放到客戶端實現的程式碼放到伺服器端,並依靠RMI進行通訊。

EJB在架構中所處的位置如上圖,EJB在J2EE開發中的詳細過程:

 

什麼是PO
◆ PO :persistent object持久物件。
O/R Mapping 是 Object Relational Mapping(物件關係對映)的縮寫。通俗點講,就是將物件與關係資料庫繫結,用物件來表示關係資料。
PO是在O/R對映的時候出現的概念,如果沒有O/R對映,沒有這個概念存在了。常用的O/R對映框架有hibernate等。通常對應資料模型(資料庫),本身還有部分業務邏輯的處理。可以看成是與資料庫中的表相對映的java物件。最簡單的PO就是對應資料庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對資料庫的操作。 1、有時也被稱為Data物件,對應資料庫中的entity,可以簡單認為一個PO對應資料庫中的一條記錄
2、在hibernate持久化框架中與insert/delet操作密切相關。
3、
PO中不應該包含任何對資料庫的操作。
4、PO的屬性是跟資料庫表的欄位一一對應的。
5、PO物件需要實現序列化介面。
就是說在一些Object/Relation Mapping工具中,能夠做到維護資料庫表記錄的persisent object完全是一個符合Java Bean規範的純Java物件,沒有增加別的屬性和方法。全都是這樣子的:  publicclassUser{ privatelongid; privateStringname; publicvoidsetId(longid){ this.id=id; } publicvoidsetName(Stringname){ this.name=name; } publiclonggetId(){ returnid; } publicStringgetName(){ returnname; } }
什麼是DTO
◆ DTO (TO) :Data Transfer Object 資料傳輸物件。
主要用於遠端呼叫等需要大量傳輸物件的地方。
可以將PO中的部分屬性抽取出來,就形成了DTO。

比如我們一張表有100個欄位,那麼對應的PO就有100個屬性。
但是我們介面上只要顯示10個欄位,客戶端用WEB service來獲取資料,沒有必要把整個PO物件傳遞到客戶端,這時我們就可以用只有這10個屬性的DTO來傳遞結果到客戶端,這樣也不會暴露服務端表結構.到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO(View Object)。

用在需要跨程序或遠端傳輸時,它不應該包含業務邏輯。
比如一張表有100個欄位,那麼對應的PO就有100個屬性(大多數情況下,DTO 內的資料來自多個表)。但view層只需顯示10個欄位,沒有必要把整個PO物件傳遞到client,這時我們就可以用只有這10個屬性的DTO來傳輸資料到client,這樣也不會暴露server端表結構。到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO(View Object)。
什麼是VO ◇ VO :value object 值物件 / view object 表現層(檢視)物件。 先說 value object 值物件:
通常用於業務層之間的資料傳遞,和PO一樣也是僅僅包含資料而已。但應是抽象出的業務物件,可以和表對應,也可以不,這根據業務的需要。個人覺得同DTO(資料傳輸物件),在web上傳遞。
VO(value object)是值物件,精確點講它是業務物件,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為資料提供一個生存的地方。VO的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的資料的名稱。
VO是什麼?它是值物件,準確地講,它是業務物件,是生活在業務層的,是業務邏輯需要了解,需要使用的,再簡單地講,
它是概念模型轉換得到的。 
首先說PO和VO吧,它們的關係應該是相互獨立的,一個VO可以只是PO的部分,也可以是多個PO構成,同樣也可以等同於一個PO(當然我是指他們的屬性)。正因為這樣,PO獨立出來,資料持久層也就獨立出來了,它不會受到任何業務的干涉。又正因為這樣,業務邏輯層也獨立開來,它不會受到資料持久層的影響,業務層關心的只是業務邏輯的處理,至於怎麼存怎麼讀交給別人吧!不過,另外一點,如果我們沒有使用資料持久層,或者說沒有使用hibernate,那麼PO和VO也可以是同一個東西,雖然這並不好 ② VO(view object)表現層物件,檢視物件
用一個VO物件對應整個介面的值。
1、主要對應頁面顯示(web頁面/swt、swing介面)的資料物件。
2、可以和表對應,也可以不,這根據業務的需要。
注 :在struts中,用ActionForm做VO,需要做一個轉換,因為PO是面向物件的,而ActionForm是和view對應的,要將幾個PO要顯示的屬性合成一個ActionForm,可以使用BeanUtils的copy方法。
什麼是DAO DAO :data access object 資料訪問物件。
這個大家最熟悉,和上面幾個O區別最大,基本沒有互相轉化的可能性和必要.
主要用來封裝對資料庫的訪問。通過它可以把POJO持久化為PO,用PO組裝出來VO、DTO。
是一個sun的一個標準j2ee設計模式,這個模式中有個介面就是DAO,它負持久層的操作。為業務層提供介面。此物件用於訪問資料庫。通常和PO結合使用,DAO中包含了各種資料庫的操作方法。通過它的方法,結合PO對資料庫進行相關的操作。夾在業務邏輯與資料庫資源中間。配合VO,提供資料庫的CRUD操作...
1、主要用來封裝對DB(資料庫)的訪問(CRUD操作)。
2、通過接收業務層的資料,把POJO持久化為PO。
什麼是BO JavaBean是一種元件技術,就好像你做了一個扳手,而這個扳手會在很多地方被拿去用,這個扳子也提供多種功能(你可以拿這個扳手扳、錘、撬等等),而這個扳手就是一個元件。 BO :business object 業務物件。

主要作用是把業務邏輯封裝為一個物件。這個物件可以包括一個或多個其它的物件。
比如一個簡歷,有教育經歷、工作經歷、社會關係等等。
我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會關係對應一個PO。
建立一個對應簡歷的BO物件處理簡歷,每個BO包含這些PO。
這樣處理業務邏輯時,我們就可以針對BO去處理。

封裝業務邏輯的java物件,通過呼叫DAO方法,結合PO,VO進行業務操作。
封裝業務邏輯為一個物件(可以包括多個PO,通常需要將BO轉化成PO,才能進行資料的持久化,反之,從資料庫中得到的PO,需要轉化成BO才能在業務層使用)。
關於BO主要有三種概念
1 、只包含業務物件的屬性;
2 、只包含業務方法;
3 、兩者都包含。
在實際使用中,認為哪一種概念正確並不重要,關鍵是實際應用中適合自己專案的需要。