Java中的POJO是什么?
1.介绍
在这个简短的教程中,我们将研究“普通Java对象”(Plain Old Java Object)的定义,简称POJO。我们将看看POJO与JavaBean的比较,以及如何将POJO转换为JavaBean。
2.普通java对象
2.1 何为普通java对象?
当我们谈论POJO时,我们所描述的是一个简单的类型,没有任何特定框架的引用。POJO对我们的属性和方法没有命名约定。
让我们创建一个基本的员工POJO。它将有三个属性;名字、姓氏和入职日期:
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;
}
}
这个类可以被任何Java程序使用,因为它不绑定到任何框架。但是,我们没有遵循任何真正的约定来构造、访问或修改类的状态。这种缺乏惯例的做法造成了两个问题:
1)如何使用它需要理解一下。
2)它可能会限制框架对其支持约定而不是配置、理解如何使用类以及增强其功能的能力。
为了探索第二点,让我们使用反射来处理EmployeePojo。因此,我们将开始发现它的一些局限性。
2.1 反射一个POJO
先添加一个依赖:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
现在,让我们检查一下POJO的属性:
List<String> propertyNames =
PropertyUtils.getPropertyDescriptors(EmployeePojo.class).stream()
.map(PropertyDescriptor::getDisplayName)
.collect(Collectors.toList());
如果要将propertyNames打印到控制台,我们只会看到:
[start]
在这里,只找到start(因为是getStart方法)。PropertyUtils未能找到其他两个。
如果我们使用像Jackson这样的其他库来处理EmployeePojo,我们也会看到同样的结果。
理想情况下,我们可以查看所有属性:firstName、lastName和startDate。好消息是许多Java库默认支持JavaBean命名约定。
3.JavaBeans
3.1 何为JavaBean?
JavaBean仍然是一个POJO,但围绕如何实现它引入了一组严格的规则:
- 访问级别—要求属性是私有的,并暴露公开getter和setter方法。
- 方法名–getter和setter遵循getX和setX约定(对于布尔值,isX可以用于getter)
- 默认构造函数–必须存在无参数构造函数,以便在不提供参数的情况下创建实例,例如在反序列化期间
Serializable–实现Serializable接口允许我们存储状态。
3.2 将EmployeePojo转换为一个JavaBean
public class EmployeeBean implements Serializable {
private static final long serialVersionUID = -3760445487636086034L;
private String firstName;
private String lastName;
private LocalDate startDate;
public EmployeeBean() {
}
public EmployeeBean(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
// additional getters/setters
}
3.3 反射一个JavaBean
当我们用反射检查bean时,现在我们得到了属性的完整列表:
[firstName, lastName, startDate]
4.使用JavaBeans时的权衡
所以,我们展示了JavaBeans的一种有用方法。注意,每一个设计选择都会带来权衡。
在使用JavaBeans时,我们还应该注意一些潜在的缺点:
- 可变性–JavaBean由于其setter方法而具有可变性–这可能会导致并发性或一致性问题
- 样板文件–我们必须为所有属性引入getter,为大多数属性引入setter,其中大部分可能是不必要的零参数构造函数——我们经常需要构造函数中的参数来确保对象以有效状态实例化,但是JavaBean标准要求我们提供零参数构造函数。
考虑到这些权衡,这些年来,框架也适应了其他bean约定。
5.示例代码
完整程序代码:什么是POJO
Java中的POJO是什么?的更多相关文章
- [转]Java中的POJO类
简单的Java对象(Plain Old Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter se ...
- java中的POJO、PO、VO分别是什么?
1.PO:persistant object 持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 2. VO:value object值对象. 通常 ...
- java中的PO,VO,TO,BO,DAO,POJO的解释
java的(PO,VO,TO,BO,DAO,POJO)解释 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...
- 在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
在Java中VO , PO , BO, DAO ,POJO是什么意思 最近在项目中,遇到VO,我的天...那就一起学习回忆一下 首先简单说明下: O/R Mapping是Object Relatio ...
- java中的几种架构对象(PO,VO,DAO,BO,POJO)
java中的几种对象(PO,VO,DAO,BO,POJO) 一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生 ...
- Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)
PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...
- java中使用反射获取pojo(实体)类的全部字段值
说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...
- java中POJO类和DTO类都要实现序列化
java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序 ...
- java中使用反射获取pojo(实体)类的所有字段值
出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...
- java中pojo对象首字母大写导致无法赋值问题
命名规范(文末附有java命名规范)中指出,属性变量命名应采用驼峰命名的方式,即首字母小写,其他单词首字母大写: 但有时候我们对接三方的接口时,想要封装实体类来接受,但是发现接收到的参数的变量首字母是 ...
随机推荐
- Nginx 配置文件备忘单
Nginx 是用于 Web 服务.反向代理.缓存.负载平衡.媒体流等的开源软件.在这篇文章中,我将提到一些我们经常使用的 Nginx 配置. 监听端口 server { Standard HTTP P ...
- [转帖]从小白到精通:揭秘perf工具的全部功能与操作技巧
https://zhuanlan.zhihu.com/p/664396453 目录 收起 一.引言 二.理解perf工具的基本概念 三.安装与配置perf工具 3.1.不同操作系统的perf工具安 ...
- 阿里云龙蜥8.6部署SQLSERVER2022的过程
阿里云龙蜥8.6部署SQLSERVER2022的过程 背景 之前总结过, 但是发现当时是preview版本. 这里想升级一下, 并且顺便抄一下他的部分说明 下载 wget https://packag ...
- [转帖]VMware Workstation PRO 17.0.2正式版+激活密钥
https://www.isharepc.com/36181.html VMware Workstation PRO 17是一个简化的桌面虚拟化应用程序. 它在同一台计算机上运行一个或多个操作系统而无 ...
- 【转帖】ARM 虚拟化技术简介
一. 虚拟化技术二. 虚拟化技术的比较2.1 全虚拟化和二进制重写(Pure virtualization and binary rewriting)2.2 半虚拟化( Para-virtualiza ...
- Oracle 提示 用户在线,无法删除的清理方法
查找删除策略. select username,sid,serial# from v$session where username='FSSCDEC004'; alter system kill se ...
- Jumper Server 堡垒机搭建过程
Jumper Server 堡垒机搭建过程 背景说明 公司组织考核, 要对一套系统进行安全设置.有一个项目是使用堡垒机进行登录 堡垒机有多种用途,可以实现日志审计和安全设置等. 买商业设备的话太困难了 ...
- docker 镜像导出和导入(适用于内网无法拉镜像的问题)
1.在外网将镜像从指定的仓库拉下来 docker pull consul 现在已将consul镜像拉到了可连外网的服务器 2.将镜像把包到指定的tar文件中 docker save consul:l ...
- Protobuf示例:Golang and Python
之前的文章中已经展示过如何在C++中使用protobuf,本文将简单示范protobuf在Golang和Python中的使用. Talk is cheap. Show you my code. 首先是 ...
- Python自动化办公--Pandas玩转Excel数据分析【二】
相关文章: Python自动化办公--Pandas玩转Excel[一] Python自动化办公--Pandas玩转Excel数据分析[三] python处理Excel实现自动化办公教学(含实战)[一] ...