到底什么是POJO?
概述
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程序使用,因为它没有框架的束缚。但是,我们并没有遵循任何真正的约定来构造、访问、或者修改字段的值。缺乏约定会导致两个问题:
- 使用它的人会增加学习难度。
- 它可能会限制框架支持约定而不是配置,了解如果使用它以及扩展。
为了探究第二点,我们使用反射来获取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,但是它遵守一组严格的规则:
- 访问级别 - JavaBean的属性必须是私有的,get、set方法是public
- 方法名称 - getter和setter遵循getX和setX的约定(对于Boolean,isX替代getter)
- 默认构造函数 - 必须存在无参的构造函数,一遍可以在不提供参数的情况下创建实例,例如:序列化期间
- 可序列化 - 实现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时,还应该注意一些潜在的问题:
- 可变性 - 我们的JavaBeans由于使用setter方法,随时可以修改。这可能导致一些并发问题或者一致性问题
- 灵活性 - 一般我们必须为所有的属性设置一个值,其中大部分可能都是没有必要的。例如使用JPA修改密码时,我可能只需要userId和password
- 无参构造函数 - 我们经常通过有参构造函数来确保对象以有效的状态实例化,但是JavaBean标准要求我们提供了无参构造函数
结论
我们将POJO与JavaBeans进行了比较,POJO是一个没有任何约束且没有特定框架绑定的Java对象,而JavaBean时具有严格约定的POJO的一种特殊类型。
到底什么是POJO?相关推荐
- 别乱分层,PO、VO、DAO、BO、DTO、POJO 到底应该用在哪里,你知道吗
一.PO :(persistant object),持久对象 二.VO :(value object),值对象 三.DAO :(Data Access Objects),数据访问对象接口 四.BO : ...
- Spring Boot开发中,经常听到的PO、VO、DAO、BO、DTO、POJO到底是什么?
在Spring Boot开发中,我们经常会听到诸如PO.VO.DAO.BO.DTO.POJO等概念.这些术语看起来很相似,但它们之间有着不同的含义和用途.在本文中,我们将详细介绍这些概念,并解释它们在 ...
- 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- Spring MVC 到底是如何工作的
转载自 Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分--Spring Web MVC的强大功能及其内部工作原理. 这篇文章的源代码可以在GitHub上找到. 项 ...
- MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?
文章目录 前言 一.回忆什么是 MVC 模式? 1.1.Model.View.Controller 组件介绍 1.2.明确 View 与 Controller 组件区别 二.什么是 Servlet? ...
- entity、bo、vo、po、dto、pojo如何理解及相互转化
先介绍一下我们经常会用到的一些对象:entity.POJO.VO.DTO.BO和PO. 概念: Entity 最常用实体类,基本和数据表一一对应,一个实体一张表. Bo(business object ...
- VO,PO,BO,QO, DAO ,POJO,的概念
原文链接:http://www.blogjava.net/luofeng225/archive/2009/03/28/262620.html 原文作者令我非常感动的一个故事: <我曾经听到这么一 ...
- 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 ...
- java web项目VO,dao,pojo,dto,bo,
VO(Value Object) 值对象 通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已.但应是抽象出的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 .用 new ...
最新文章
- 【SSM框架系列】SpringMVC基本介绍
- python小波特征提取_Python 小波包变换,小波包能量特征提取 代码
- hadoop+hive+flink+hbase交互的版本兼容性
- html语言简单,简单的html语言计算器
- mongodb数据库淘汰_mongodb 内存数据淘汰策略
- asp.net学习之SqlDataSource 1 select的四种参数赋予形式的解释
- linux 内核内核签名_24岁生日快乐,Linux内核
- break和continue区别python_1、Python中break和continue的区别
- 性能指标之速率、带宽、吞吐量
- python上传文件到windows_python使用win32gui上传文件
- Python快速判断素数方法
- ffmpeg限制文件大小php,ffmpeg将音频比特率限制为128kb / s [关闭]
- 休息时间!哪些业余活动能提升开发人员的技能?
- matlab平坦衰落,平坦衰落信道的MATLAB仿真
- 用python3制作音乐的探索
- 高等数学(预备知识之反函数)
- 服务器内存超频性能,测试篇:内存超频性能测试
- QT 操作 msword.olb
- 张飞电子工程师速成视频教程百度云_如何评价张飞电子推出的《电子工程师速成》视频教程?...
- 【java基础】java的反射机制