很多人问POJO是什么东西,他翻译过来“平实JAVA类”看似意思与JAVA BEAN相似,难道JAVA领域都在反复造概念?同一个概念起很多名词?
其实POJO是一个非常具有时代色彩的名词,要说这个词的来源还有一个故事:话说在早期JAVA开发企业级应用的时候,没有什么框架技术可选,SUN有一天首先提出了EJB的概念,让人们认识到企业级应用也可以复用,不久第一个版本的EJB规范和实现出炉了。这让人们欣喜若狂,因为终于有可用的企业级应用框架了,人们可以省去很多过去的工作,然而Entity Bean糟糕的设计导致人们使用EJB带来的好处远远小于带来的麻烦,但是人们仍然信奉EJB。所以,Martin Fowler,Rebecca Parsons和Josh MacKenzie在2000年12月一次会议上呼吁人们放弃使用Entity Bean而使用普通JAVA对象,但是没人听他的,原因在于Entity Bean是规范,遵守规范从长远角度上看可能带来潜在的好处。所以Martin Fowler在一次会议上说“我开始不明白人们为什么不肯放弃Entity Bean而使用普通JAVA对象,现在明白了,原因是普通JAVA对象缺少一个像Entity Bean那样响亮的名字”,所以普通JAVA对象的新名字POJO诞生了。
不管你是否鄙视JAVA领域这种新瓶装旧酒的现象,但是有一点不能否认,自从有了POJO之后,人们开始转向普通JAVA对象,以至于大量以POJO和DI为核心的轻量级框如雨后春笋一样涌现出来,POJO概念流传至今仍在使用,它的“呼吁”价值比其“使用”价值更高,这是典型的名词现象。它唤醒人们时刻谨记使用与框架解耦的领域对象(POJO)来实现“非侵入式”设计,避免陷入Entity Bean当年的境遇。在很多框架中,实现POJO的主要手段是使用no-interface方式,即用annotation注解而不需要模型实现任何接口,这样的类通常都可以成为POJO,能够在任何框架中不修改代码运行,也可以跑在本地单元测试环境中。
比如Servlet典型不是POJO,因为要求强制实现HttpServlet接口,复写doPost方法,在Servlet3.0中取消限制而用annotation描述要执行的方法,Servlet就成为了POJO。
Martin Fowler原文:http://martinfowler.com/bliki/POJO.html