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命名规范)中指出,属性变量命名应采用驼峰命名的方式,即首字母小写,其他单词首字母大写: 但有时候我们对接三方的接口时,想要封装实体类来接受,但是发现接收到的参数的变量首字母是 ...
随机推荐
- [转帖]Linux内存管理(一)——从硬件角度看内存管理
从硬件角度看内存管理 ①.在操作系统还没有出来之前,程序都是被存放在卡片上,计算机读取一张卡片就运行一条指令.这种从外部存储介质上直接运行指令的方法效率很低 ②.单道编程的内存管理 所谓单道,就是整个 ...
- [转帖] 容器内的Linux诊断工具0x.tools
https://www.cnblogs.com/codelogs/p/16242999.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# Linux上有 ...
- [转帖]Centos7 nginx访问日志文件割接
一.yum安装nginx 二.各文件路径( /etc/nginx/nginx.conf) 1.访问日志路径:access_log /var/log/nginx/access.log main; 2.p ...
- [转帖]拜托!面试请不要再问我Spring Cloud底层原理
https://www.cnblogs.com/jajian/p/9973555.html 概述# 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大 ...
- [转帖]IO多路复用的三种机制Select,Poll,Epoll
I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作 ...
- 部署于K8S集群上面应用性能影响点推测
前言 本人2017年第一次接触K8S. 中间断断续续学习K8S相关的内容. 但是最近一年,几乎没太有学习. 因为之前学习了四五年, 一直以为产品马上要用 结果一直被浇冷水. 去年开始学乖了. 不这么搞 ...
- K8S的pod展示镜像信息
https://kubernetes.io/zh/docs/tasks/access-application-cluster/list-all-running-container-images/ ku ...
- SUBMIT指定用户名错误
1.SUBMIT说明 在ABAP中,SUBMIT关键字用于运行另一个ABAP程序.通过SUBMIT关键字,可以在当前程序内部调用其他程序,而无需关闭当前程序. SUBMIT语句的一般语法如下: &qu ...
- TypeScript数组类型定义
第一种方式:可以在元素类型后面接上 [],表示由此类型元素组成的一个数组: var arr: number[] = [1, 2, 3]; //数字类型的数组 var arr2: string[] = ...
- c++ container容器(string,vector,map,queue,stack等等)
STL和c++标准库 标准模板库STL部分包含在C++标准库中的软件库. c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std:: namespace里面 由于一个常见的误 ...