深入理解 Java中 POJO 与 JavaBean 的区别
Java中经常能在Intellij中看到pojo这个类,这到底是干啥的呢?
在 Java 项目里你经常看到的 POJO 其实不是某个"特殊的类",而是一个
概念。
📌 什么是 POJO?
POJO = Plain Old Java Object
直译:朴素的、普通的 Java 对象。
意思就是:
👉 它是一个非常简单的 Java 类,里面只有一些 属性(fields) 和它们的
getter/setter 方法,可能再加上
toString()、equals()、hashCode(),除此之外没啥逻辑。
📌 为什么要有 POJO?
在企业开发(特别是 Java Web / Spring
项目)里,我们经常需要用类来承载一条数据记录,比如数据库中的一张表、前端传过来的
JSON 数据。
这个时候,就会用 POJO 来作为"数据载体"。
比如数据库表 user:
id name age
1 Bruce 25
对应的 Java POJO:
public class User {
private int id;
private String name;
private int age;
// getter/setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
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; }
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', age=" + age + "}";
}
}
这就是一个标准的 POJO 类。
📌 POJO 在实际开发里的角色
-
和数据库表对应
ORM 框架(如 MyBatis、Hibernate、JPA)会把数据库表的数据映射到
POJO。 -
和前端交互
Spring MVC 中,前端传来的 JSON 可以直接绑定到
POJO,返回时也会序列化为 JSON。 -
数据传输对象(DTO)、实体类(Entity)
DTO、Entity 本质上也是一种 POJO,只是职责不同。
📌 和其他名词的关系
- POJO:普通的 Java 类(最广泛的概念)\
- JavaBean:带有无参构造方法、属性可序列化、getter/setter 的
POJO(可以当作更严格的 POJO)。\ - Entity:持久化层的 POJO,和数据库表直接对应。\
- DTO:数据传输对象,还是 POJO,只是用来在不同层之间传数据。
👉 总结一句话:
POJO 在 Java
项目里就是"纯粹的数据类",没有业务逻辑,主要用来装数据。
不是已经有了 JavaBean,为什么还要这个 POJO?
确实很多人一开始都会困惑:既然已经有 JavaBean,为什么又搞个
POJO?
📌 先看 JavaBean 是什么
JavaBean 是 Sun 公司在 1997 年提出的一个组件规范,目的是让 Java
类能在可视化开发工具里(当时的 IDE)像积木一样拖拽复用。
JavaBean 的要求(约束):
- 必须有 无参构造方法\
- 属性必须是 私有的(private),并通过
getter/setter暴露\ - 必须是 可序列化的(通常实现
Serializable接口)
举个例子:
import java.io.Serializable;
public class UserBean implements Serializable {
private String name;
private int age;
public UserBean() {} // 无参构造
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。
📌 POJO 的出现
POJO(Plain Old Java Object)这个概念大约在 2000 年前后流行起来,最早是
Martin Fowler 提出来的。
👉 它的意思就是:
"我们不想被 EJB(Enterprise JavaBean)、JavaBean
这些繁琐的规范限制住,我就写一个普通的类,想加 getter/setter
就加,想不加就不加,不一定要实现 Serializable,不一定要符合所谓的 Bean
规范。"
比如:
public class User {
public String name; // 甚至不加 private
public int age;
}
这也是 POJO!
它没有遵循 JavaBean 规范,但依然是一个普通的 Java 对象。
📌 为什么要有 POJO?
因为 JavaBean 太"重"了。\
- EJB、JavaBean 规范要求很多东西,写起来冗余,开发成本高。\
- 但是在大多数业务里,我们只是需要一个"装数据的类"。\
- 所以大家干脆就说:我们用 POJO,不要被 EJB 束缚。
于是 POJO 成为"轻量级编程"的旗帜,Spring、Hibernate、MyBatis
等框架都提倡用 POJO 来做实体类,而不是 EJB。
📌 JavaBean vs POJO 对比
| 特性 | JavaBean ✅ | POJO ✅ |
|---|---|---|
| 是否必须有无参构造 | 是 | 否 |
| 是否必须 private 属性 | 是 | 否 |
| 是否必须有 getter/setter | 是 | 否 |
| 是否必须实现 Serializable | 是 | 否 |
| 本质上 | 遵循规范的 POJO | 普通 Java 对象(无约束) |
👉 一句话总结:\
- POJO 是一个更宽泛的概念,任何普通的 Java 对象都算。\
- JavaBean 是一种特殊的 POJO,只是它必须遵循一定的规范。

浙公网安备 33010602011771号