前言

很多JAVA书都会提到POJO对象,有时候也会说Bean,尤其spring中,所有对象都称为Bean,有时候项目中有个vo包、也有model包,这些对象都是怎么区分的呢?

 

 

 

 

JavaBean

JavaBean是一种JAVA语言写成的可重用组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:

    

        所有属性为private。

 

        这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器。

 

        这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。

 

        这个类应是可序列化的。实现serializable接口。

public class UserInfo implements java.io.Serializable{  
 
//实现serializable接口。  
private static final long serialVersionUID = 1L;  
 
private String name;  
private int age;  
 
//无参构造器  
public UserInfo() {  
 
}  
 
public String getName() {  
    return name;  
}  
 
public void setName(String name) {  
    this.name = name;  
}  
 
public int getAge() {  
    return age;  
}  
 
public void setAge(int age) {  
    this.age = age;  
}  
 
//javabean当中可以有其它的方法  
public void userInfoPrint(){  
    System.out.println("");  
}  
}

 

POJO

POJO :plain ordinary java object 无规则简单java对象。有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

POJO其实是比javabean更纯净的简单类或接口。POJO严格地遵守简单对象的概念,而一些JavaBean中往往会封装一些简单逻辑。

 

POJO主要用于数据的临时传递,它只能装载数据, 作为数据存储的载体,而不具有业务逻辑处理的能力。

/**
 * POJO类代码示例
 */  
public class UserInfoPojoDemo {
    private int userId;// 用户帐号
    private String pwd;// 用户密码
    /**
     * Constructor
     */
    public UserInfoPojoDemo() {
    }
    public UserInfoPojoDemo(String pwd) {
        this.pwd = pwd;
    }
    public UserInfoPojoDemo(int userId) {
        this.userId = userId;
    }
    public UserInfoPojoDemo(int userId, String pwd) {
        this.userId = userId;
        this.pwd = pwd;
    }
    /**
     *Access 
     */
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

Javabean虽然数据的获取与POJO一样,但是javabean当中可以有其它的方法。

一个中间对象,可以转化为PO、DTO、VO。

 

PO

 

PO:persistent object 持久对象

1 .有时也被称为Data或Model对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。

2 .在hibernate持久化框架中与insert/delet操作密切相关。

3 .PO中不应该包含任何对数据库的操作。

VO

 

VO:value object 值对象 / view object 表现层对象

1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。

2 .可以和表对应,也可以不,这根据业务的需要。

 

DTO

 

DTO(TO):Data Transfer Object 数据传输对象

1 .用在需要跨进程或远程传输时,它不应该包含业务逻辑。

2 .比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

BO

 

BO:business object 业务对象

业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。

比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。

建立一个对应简历的BO对象处理简历,每个BO包含这些PO。

这样处理业务逻辑时,我们就可以针对BO去处理。

封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。

关于BO主要有三种概念

1 、只包含业务对象的属性;

2 、只包含业务方法;

3 、两者都包含。

在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。

DAO

 

DAO:data access object数据访问对象

1 .主要用来封装对DB的访问(CRUD操作)。

2 .通过接收Business层的数据,把POJO持久化为PO。

 

以上介绍了JAVA中的一些对象名称,具体的区别可以视具体的业务而区分。