究竟什么是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, 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,它不应该依赖于框架即继承或实现某些框架类或接口。例如:Struts1中的Action和ActionForm当然不属于POJO了,而在Struts2中的Action由于可以不继承任何的接口,所以在这种情况下Action是POJO,但是Struts2中的Action也可以继承ActionSupport类就不再属于POJO了。POJO里面是可以包含业务逻辑处理和持久化逻辑,也可以包含类似与JavaBean属性和对属性访问的set和get方法的。
       最后,我们总结一下给一个定义把,POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
   

时间: 2024-10-21 18:02:19

究竟什么是POJO?的相关文章

探究推荐引擎瞬间被“秒”背后:究竟是什么让用户接踵而至?

6月16日,阿里云技术专家郑重(卢梭)将做客,直播分享<技术实战:21天搭建推荐系统>,报名地址:https://yq.aliyun.com/webinar/join/14 推荐引擎官网 "我是做电商CRM的,市场中有非常多的CRM在相互竞争,必须要找到一个能让自己的产品区别于竞争对手,甚至优于对手的核心能力.现在产品的未来都压在推荐引擎上,我需要你们帮助定制出这项能力."一位企业的负责人如此坦言. 5月18日上午11点,推荐引擎新版上线,在限量提供折扣抢购后,所有的产品瞬

好的网店系统究竟有多重要

好的网店系统究竟有多重要 2010年12月4日下午,同心圆软件CEO左家华表示,研发.升级强大的IT系统,是B2C企业最核心的竞争力. 左家华谈到,系统不稳定.库存不精确,这是很多企业遇到的问题.用户在前台下完单,后台库房却找不到产品,这严重影响到了网站的用户体验,同时也是系统效率的问题.京东商城每年耗资数千万研发升级系统.构建六百人的研发团队,亚马逊系统花几个亿才做系统,他们把轻公司做重,正是在构建自己的核心竞争力. V5shop认为:对于B2C企业来说,有四个非常重要的数据,分别是:营销成本

POJO应用架构:Spring与EJB 3.0的对比

架构 爱因斯坦曾经说过:"每件事物都应该尽可能简单,而不是更简单".的确,对科学真理的追求都是为了简化理论的根本假设,这样我们才能处理真正麻烦的问题.企业级软件的开发也是这样的. 简化企业级软件开发的关键是提供一个隐藏了复杂性(例如事务.安全性和永续性)的应用框架.良好设计的框架组件可以提升代码的重复使用(reuse)能力,提高开发效率,从而得到更好的软件质量.但是,目前J2EE 1.4中的EJB 2.1框架组件被人们普遍认为是设计较差的和过于复杂的.Java开发者对EJB 2.1很不

php.ini究竟放哪里?

Q:php.ini究竟放哪里? A:在Unix上,php.ini文件缺省放在/usr/local/lib上面,因为缺省的存放路径是/lib,但是可以在编译的时候使用--with-config-file-path参数来修改php.ini的存放位置,例如你可以使用--with-config-file-path=/etc把它存放到/etc下面,然后可以从源码包中拷贝php.ini-dist到/etc/php.ini并修改使之满足需要.Windows上面php.ini的缺省位置是windows系

个人站长的前途究竟在哪里

在互联网越来越同质化的今天,个人站长的前途究竟在哪? 个人站长已经从过去单纯的兴趣发展到现在的盈利,没有盈利,个人站长就是不务正业,这句话可能有点过分,但是现实就是如此,不盈利的个人站长,就称不上真正的站长. 现在已经不是单打独斗的时代了,在竞争越来越激烈的今天,只有抱团做站才是个人站长的前途. 如今个人站长的劣势已经越来越明显,具体表现如下: 1.时间:个人站长1天在电脑前10个小时可能很正常,但是健康也没有保证了.再者,即使一天工作24个小时,其效率也是非常低下的. 做站从前期调研策划到设计

word-wrap 和 word-break 究竟是什么意思?

word-wrap 和 word-break 究竟是什么? 为什么会乐此不疲地重复碰到这个问题? 这个问题是问题么? 我们经常需要"修复"一个老生常谈的"bug",那就是文本的自动换行问题.在专业术语上,这种期望得到的渲染现象被称作"word wrap",即文本处理器有能力把超出页边的整个词自动传到下一行. 在现实项目中,尤其是在测试阶段,鉴于测试使用非常极端的测试用例,我们经常需要"修复"如图所示的这个问题: 长单词溢出 图

JavaScript脚本的void(0)究竟是何含义

我们在 JavaScript脚本中就会经常可以看到这样的代码: 〈a href="javascript:changeNum();void(0);"〉here〈/a〉 但这儿的void(0)究竟是何含义呢? JavaScript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void 操作符用法格式如下: 1. javascript:void (e­xpression) 2. javascript:void e­xpression e­xpression 是一个要计算

用户研究小技巧:用户测试的目的究竟是神马?

文章描述:发现用户言行不一的小技巧之感性篇. 早在19世纪30年代,美国心理学家 Richard LaPiere 就意识到一个人的态度与行为并不总是很牢固地联系在一起.LaPiere 得出这样的结论:如果你想预测一个人在面对某一真实的特定情景或特定人物时将如何表现的话,对假设性情景的口头回答(即用户的态度)是远远不够的. 事实的确如此,人类总有一种惯性,即使有最好的意图,也是说一套做一套.用户也不外乎凡人的本性,那么,我们如何快速的发现用户在进行测试时是真心还是假意呢,下面就是我作为一名小实习生

探讨企业站究竟适不适合做长尾词

开门见山了,长期做企业站优化的朋友应该都有这样的感觉:单靠几个主关键词的排名究竟有多大意义,如果几个关键词的搜索量还可以,那么只要你等做到百度第一页,自然可以给企业站带来不错的流量,但是一个站点流量绝大多数还是来自于长尾词.有人说企业站也可以去做一些长尾词的,这样也是能够获得一些有意义的流量,不过仔细思考下,流量的真正意义是什么呢?不用我多啰嗦,那就是转化率,流量能否转化为企业的订单或咨询量.对于一个企业来说,卖掉产品或提升企业品牌才是最重要的,假如一个用户只是偶然搜索一个与产品无关的长尾词,然