天天看點

究竟什麼是POJO?

      pojo(plain old java object)這種叫法是martin fowler、rebecca parsons和josh mackenzie在2000年的一次演講的時候提出來的。

      我在做j2ee教育訓練中發現我的很多學生問我什麼是pojo,後來我在寫書(《spring2初學者實踐教材》和《spring2初學者實踐教材》)的時候發現pojo這個概念無法回避。現在網上對于pojo的解釋很多,但是很多都是有錯誤的或者不夠準确。對此我一開始也是存在誤區的,我原來是這樣了解的:

        pojo是這樣的一種“純粹的”javabean,在它裡面除了javabean規範的方法和屬性沒有别的東西,即private屬性以及對這個屬性方法的public的get和set方法。我們會發現這樣的javabean很“單純”,它隻能裝載資料,作為資料存儲的載體,而不具有業務邏輯處理的能力。

    是以下面的代碼被認為是pojo了。

package com.tongking.spring;

public class dbhello implements hello {

       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)起了一個名字——pojo,這些java對象不是entitybeans(ejb的一種)。

        我又在http://www.webopedia.com/term/p/pojo.htm查到解釋如下:

        基本意思是說pojo一個正規的java對象(不是javabean,entitybean等),也不擔當任何的特殊的角色,也不實作任何java架構指定的接口。

        我覺得上面的解釋很準确,pojo應該不是我們開始認為的javabean,當然更不是ejb,它不應該依賴于架構即繼承或實作某些架構類或接口。例如:struts1中的action和actionform當然不屬于pojo了,而在struts2中的action由于可以不繼承任何的接口,是以在這種情況下action是pojo,但是struts2中的action也可以繼承actionsupport類就不再屬于pojo了。pojo裡面是可以包含業務邏輯處理和持久化邏輯,也可以包含類似與javabean屬性和對屬性通路的set和get方法的。

       最後,我們總結一下給一個定義把,pojo是一個簡單的、正規java對象,它包含業務邏輯處理或持久化邏輯等,但不是javabean、entitybean等,不具有任何特殊角色和不繼承或不實作任何其它java架構的類或接口。

上一篇: 觀滄海