概述

POJO即“Plain Old Java Object”,下面我们将POJO与JavaBean进行比较,以及如何将POJO转换为JavaBeans。

Plain Old Java Object

什么是POJO?

一般当我们谈论POJO时,描述的是一种简单的类型,没有涉及到任何框架。POJO对属性和方法没有命名约定。

当我们创建一个员工POJO,它具有三个属性:fisrtName、lastName、startDate。

public class EmployeePojo {public String firstName;public String lastName;private LocalDate startDate;public EmployeePojo(String firstName, String lastName, LocalDate startDate) {this.firstName = firstName;this.lastName = lastName;this.startDate = startDate;}public String name() {return this.firstName + " " + this.lastName;}public LocalDate getStart() {return this.startDate;}
}

EmployeePojo可以被任何Java程序使用,因为它没有框架的束缚。但是,我们并没有遵循任何真正的约定来构造、访问、或者修改字段的值。缺乏约定会导致两个问题:

  1. 使用它的人会增加学习难度。
  2. 它可能会限制框架支持约定而不是配置,了解如果使用它以及扩展。

为了探究第二点,我们使用反射来获取EmployeePojo的属性。这样,我们将发现它的一些局限性。

对POJO进行反射

添加BeanUtils的Maven依赖到项目中:

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>

接下来,让我们使用反射获取POJO的属性:

List<String> propertyNames =
Arrays.stream(PropertyUtils.getPropertyDescriptors(EmployeePojo.class)).map(PropertyDescriptor::getDisplayName)
.collect(Collectors.toList());
System.out.println(propertyNames);

执行代码,我们将看到:

[start]

是不是很懵逼?我们只看到了start (getStart),PropertyUtils找不到其他两个属性,甚至是真实的属性。

如果你使用Jackson一样的其他库来处理,同样也会遇到这个问题。理想情况下,我们将看到的结果是:firstName,lastName,startDate。好的消息是,许多的Java库默认支持JavaBean的命名约定。

JavaBeans

什么是JavaBean?

JavaBean仍然是POJO,但是它遵守一组严格的规则:

  1. 访问级别 - JavaBean的属性必须是私有的,get、set方法是public
  2. 方法名称 - getter和setter遵循getX和setX的约定(对于Boolean,isX替代getter)
  3. 默认构造函数 - 必须存在无参的构造函数,一遍可以在不提供参数的情况下创建实例,例如:序列化期间
  4. 可序列化 - 实现Serializable接口,允许存储状态

EmployeePojo转换为JavaBean

我们尝试将EmplyeePojo转换为JavaBean:

public class EmployeeBean implements Serializable {
private static final long serialVersionUID = 5570916775939868315L;
private String firstName;
private String lastName;
private LocalDate startDate;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
}

对JavaBean进行反射

当我们对JavaBean进行时,获得了属性的完整列表:

[firstName, lastName, startDate]

是否使用JavaBeans

这里展示了JavaBeans的一种用法。每个设计都需要权衡,当我们使用JavaBeans时,还应该注意一些潜在的问题:

  1. 可变性 - 我们的JavaBeans由于使用setter方法,随时可以修改。这可能导致一些并发问题或者一致性问题
  2. 灵活性 - 一般我们必须为所有的属性设置一个值,其中大部分可能都是没有必要的。例如使用JPA修改密码时,我可能只需要userId和password
  3. 无参构造函数 - 我们经常通过有参构造函数来确保对象以有效的状态实例化,但是JavaBean标准要求我们提供了无参构造函数

结论

我们将POJO与JavaBeans进行了比较,POJO是一个没有任何约束且没有特定框架绑定的Java对象,而JavaBean时具有严格约定的POJO的一种特殊类型。

到底什么是POJO?相关推荐

  1. 别乱分层,PO、VO、DAO、BO、DTO、POJO 到底应该用在哪里,你知道吗

    一.PO :(persistant object),持久对象 二.VO :(value object),值对象 三.DAO :(Data Access Objects),数据访问对象接口 四.BO : ...

  2. Spring Boot开发中,经常听到的PO、VO、DAO、BO、DTO、POJO到底是什么?

    在Spring Boot开发中,我们经常会听到诸如PO.VO.DAO.BO.DTO.POJO等概念.这些术语看起来很相似,但它们之间有着不同的含义和用途.在本文中,我们将详细介绍这些概念,并解释它们在 ...

  3. 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  4. Spring MVC 到底是如何工作的

    转载自  Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分--Spring Web MVC的强大功能及其内部工作原理. 这篇文章的源代码可以在GitHub上找到. 项 ...

  5. MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

    文章目录 前言 一.回忆什么是 MVC 模式? 1.1.Model.View.Controller 组件介绍 1.2.明确 View 与 Controller 组件区别 二.什么是 Servlet? ...

  6. entity、bo、vo、po、dto、pojo如何理解及相互转化

    先介绍一下我们经常会用到的一些对象:entity.POJO.VO.DTO.BO和PO. 概念: Entity 最常用实体类,基本和数据表一一对应,一个实体一张表. Bo(business object ...

  7. VO,PO,BO,QO, DAO ,POJO,的概念

    原文链接:http://www.blogjava.net/luofeng225/archive/2009/03/28/262620.html 原文作者令我非常感动的一个故事: <我曾经听到这么一 ...

  8. DO、DTO、BO、VO、POJO等各种O浅学(总结)

    DO.DTO.BO.VO.POJO等各种O浅学(总结) 有哪些 O 关键的 O :DO.DTO.VO.BO 整个数据流程传递 区别用处 VO与DTO的区别 VO与DTO的应用 DTO与DO的区别 DT ...

  9. java web项目VO,dao,pojo,dto,bo,

    VO(Value Object) 值对象 通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已.但应是抽象出的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 .用 new ...

最新文章

  1. 【SSM框架系列】SpringMVC基本介绍
  2. python小波特征提取_Python 小波包变换,小波包能量特征提取 代码
  3. hadoop+hive+flink+hbase交互的版本兼容性
  4. html语言简单,简单的html语言计算器
  5. mongodb数据库淘汰_mongodb 内存数据淘汰策略
  6. asp.net学习之SqlDataSource 1 select的四种参数赋予形式的解释
  7. linux 内核内核签名_24岁生日快乐,Linux内核
  8. break和continue区别python_1、Python中break和continue的区别
  9. 性能指标之速率、带宽、吞吐量
  10. python上传文件到windows_python使用win32gui上传文件
  11. Python快速判断素数方法
  12. ffmpeg限制文件大小php,ffmpeg将音频比特率限制为128kb / s [关闭]
  13. 休息时间!哪些业余活动能提升开发人员的技能?
  14. matlab平坦衰落,平坦衰落信道的MATLAB仿真
  15. 用python3制作音乐的探索
  16. 高等数学(预备知识之反函数)
  17. 服务器内存超频性能,测试篇:内存超频性能测试
  18. QT 操作 msword.olb
  19. 张飞电子工程师速成视频教程百度云_如何评价张飞电子推出的《电子工程师速成》视频教程?...
  20. 【java基础】java的反射机制

热门文章

  1. [3DHalcon] 3D鞋点胶的点云边界提取
  2. 数据结构-带头双向链表的建立,详细教程
  3. STM32 待机模式与看门狗和谐相处
  4. Activiti工作流
  5. 护考怎么使用计算机,护士资格证考试人机对话是什么软件
  6. AndroidStudio案例——图书列表
  7. css3宽度变大动画_电工不会仪表?太尴尬了。14种动画让你轻松掌握各种流量计工作原理。...
  8. Android 获取系统版本号,设备品牌等
  9. mysql 内部xa_MySQL-XA事务(一)简介
  10. 期货开户市场技术分析方法