沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同
一、前言
想必大家都有这样的困惑,接触的东西越多却越来越混乱了,这个时候就要进行对比和深入的探讨了,抓住每一个概念背后的核心,才能彻底的解决问题,形成自己的理念和道理。
二、Bean,JavaBean,POJO,VO,PO,EJB等名词的比较
2.1、Bean
Bean的中文含义是“豆子”,Bean的含义是可重复使用的Java组件。所谓组件就是一个由可以自行进行内部管理的一个或几个类所组成、外界不了解其内部信息和运行方式的群体。使用它的对象只能通过接口来操作。Bean并不需要继承特别的基类(BaseClass)或实现特定的接口(Interface)。Bean的编写规范使Bean的容器(Container)能够分析一个Java类文件,并将其方法(Methods)翻译成属性(Properties),即把Java类作为一个Bean类使用。Bean的编写规范包括Bean类的构造方法、定义属性和访问方法编写规则。
2.2、javaBean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。 Java Bean 是不能被跨进程访问的。JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去。所有遵循“一定编程原则”的Java类都可以被称作JavaBean。
JavaBean在Java EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象(内省机制),并且通过反射那些遵循命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。(可以这么理解,POJO按JavaBean的规则来,就可以变成JavaBean)。简而言之,当一个POJO可序列化(本质上是不可以序列化的),有一个无参的构造函数,使用getter和setter方法来访问属性时,就是一个JavaBean。
对于JavaBean,就是一个Java模型组件,为使用Java类提供了一种标准的格式,在用户程序和可视化管理工具中可以自动获得这种具有标准格式的类的信息,并能够创建和管理这些类。 JavaBean可以使应用程序更加面向对象,可以把数据封装起来,把应用的业务逻辑和显示逻辑分离开,降低了开发的复杂程度和维护成本;JavaBean 是一种JAVA语言写成的可重用组件。Java Bean 是不能被跨进程访问的。JavaBean 是使用 java.beans 包开发的,它是 Java 2 标准版的一部分。JavaBean 是一台机器上同一个地址空间中运行的组件。JavaBean 是进程内组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:
1 所有属性为private。 2 这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器。 3 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。 4 这个类应是可序列化的。实现serializable接口。
2.3、POJO
POJO(Plain Old Java Object)按照Martin Fowler的解释是“Plain Old Java Object”,从字面上翻译为“纯洁老式的Java对象”,但大家都使用“简单java对象”来称呼它。POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。
POJO是一个简单的、普通Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。 可以包含类似与JavaBean属性和对属性访问的setter和getter方法的。POJO(Plain Old Java Object)这个名字用来强调它是一个普通java对象,而不是一个特殊的对象。“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{ ...
一般在web应用程序中建立一个数据库的映射对象时,我们只能称它为POJO。将业务逻辑写进规则的Java对象(regular java objects)中,比使用Entity Beans更有好处。另外给具有业务逻辑处理的规则的Java对象(regular java objects)起了一个名字——POJO,这些Java对象不是EntityBeans。基本意思是说POJO一个普通的Java对象(不是JavaBean,EntityBean等),也不担当任何的特殊的角色,也不实现任何Java框架指定的接口。POJO里面是可以包含业务逻辑处理和持久化逻辑,也可以包含类似与JavaBean属性和对属性访问的set和get方法的。POJO是一个简单的、普通Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。
大家可以看官方解释,在很多地方都是错误的,说POJO不能包含业务逻辑:
POJO可以认为是一个中间对象:
一个中间对象,可以转化为PO、DTO、VO。 1 .POJO持久化之后==〉PO 2 .POJO传输过程中==〉DTO 3 .POJO用作表示层==〉VO
2.4、VO
VO :value object 值对象 / view object 表现层(视图)对象。
通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。个人觉得同DTO(数据传输对象),在web上传递。VO(value object)是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。VO准确地讲,是业务对象,是业务逻辑需要了解,需要使用的,再简单地讲,它是概念模型转换得到的。
首先说PO和VO吧,它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO。正因为这样,PO独立出来,数据持久层也就独立出来了,它不会受到任何业务的干涉。又正因为这样,业务逻辑层也独立开来,它不会受到数据持久层的影响,业务层关心的只是业务逻辑的处理,至于怎么存怎么读交给别人吧!不过,另外一点,如果我们没有使用数据持久层,或者说没有使用hibernate,那么PO和VO也可以是同一个东西,虽然这并不好。
VO(view object)表现层对象,视图对象。用一个VO对象对应整个界面的值。主要对应页面显示(web页面/swt、swing界面)的数据对象。可以和表对应,也可以不,这根据业务的需要。
2.5、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对象,没有增加别的属性和方法。
2.6、EJB
Enterprise Bean,也就是Enterprise JavaBean(EJB),是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。在 J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话 Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。 这个类一般用单例模式来实现,因为每次连接都需要用到它。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进行通信。
2.7、DAO
data access object 数据访问对象。主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO。是一个sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合VO,提供数据库的CRUD操作。主要用来封装对DB(数据库)的访问(CRUD操作)。通过接收业务层的数据,把POJO持久化为PO。
2.8、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)。
2.9、BO
business object 业务对象。主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从数据库中得到的PO,需要转化成BO才能在业务层使用)。关于BO主要有三种概念:只包含业务对象的属性;只包含业务方法;两者都包含。在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。
参考文献:https://blog.csdn.net/chenchunlin526/article/details/69939337