我不确定有什么区别。我正在使用Hibernate,在一些书中,他们使用JavaBean和POJO作为可互换的术语。我想知道是否有区别,不仅仅是在Hibernate上下文中,而是在一般概念上。
当前回答
所有Pojo(s)都是JavaBean(s),但并非相反。
什么是POJO?
POJO没有属性或方法的命名约定。对于构造、访问和修改类的状态,我们没有遵循任何真正的约定。 例子: 公共类Pojo { 字符串名字; LASTName; 字符串名称(){ 返回。firstname + " " + this.LASTName; } } 在这里,我可以用first_name或firstname或任何名词替换firstname,变量LASTName也一样。
这个词之所以被广泛接受,很可能是因为 需要一个常见的和容易理解的术语,与 复杂的对象框架
使用POJO的反射。
它可能会限制框架偏好约定而不是配置、理解如何使用类以及增强其功能的能力
List<String> propertyNames =
Arrays.stream(PropertyUtils.getPropertyDescriptors(Pojo.class))
.map(PropertyDescriptor::getDisplayName)
.collect(Collectors.toList());
System.out.println(propertyNames);
如果我们使用第三方库PropertyUtils进行反射,我们可能会遇到问题,因为这会导致
[]
什么是Java Beans?
A JavaBean is still a POJO but introduces a strict set of rules around how we implement it: Access levels – our properties are private and we expose getters and setters. Method names – our getters and setters follow the getX and setX convention (in the case of a boolean, isX can be used for a getter) Default Constructor – a no-argument constructor must be present so an instance can be created without providing arguments, for example during deserialization Serializable – implementing the Serializable interface allows us to store the state.
例子:
@Getter
@Setter
class Pojo implements Serializable {
public String firstName;
public String lastName;
}
使用Java Bean进行反射。
If we again use third party Libraries such as `PropertyUtils` for reflection the result will be different[firstName,lastName]
其他回答
所有的javabean都是pojo,但并非所有的pojo都是javabean。
JavaBean是满足某些编程约定的Java对象:
JavaBean类必须实现Serializable或Externalizable; JavaBean类必须有一个公共的无参数构造函数; 所有JavaBean属性必须有公共setter和getter方法(视情况而定); 所有JavaBean实例变量都应该是私有的。
综上所述:相同点和不同点是:
java beans: Pojo:
-must extends serializable -no need to extends or implement.
or externalizable.
-must have public class . - must have public class
-must have private instance variables. -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor. - can have constructor with agruments.
所有JAVA bean都是POJO,但并非所有POJO都是JAVA bean。
普通的旧java对象
Pojo类是一个没有任何特殊特性的普通类,从技术/框架上完全松散耦合。这个类不是从技术/框架实现的,也不是从技术/框架API扩展的,这个类叫做pojo类。
Pojo类可以实现接口和扩展类,但超类或接口不应该是一种技术/框架。
例子:
1.
class ABC{
----
}
ABC类没有实现或从技术/框架扩展,这就是为什么这是pojo类。
2.
class ABC extends HttpServlet{
---
}
从servlet技术api扩展的ABC类,这就是为什么这不是一个pojo类。
3.
class ABC implements java.rmi.Remote{
----
}
ABC类从rmi api实现,这就是为什么这不是一个pojo类。
4.
class ABC implements java.io.Serializable{
---
}
这个接口是Java语言的一部分,而不是技术/框架的一部分。这是pojo课。
5.
class ABC extends Thread{
--
}
这里线程也是Java语言的类,所以这也是一个pojo类。
6.
class ABC extends Test{
--
}
如果Test类从技术/框架中扩展或实现,那么ABC也不是pojo类,因为它继承了Test类的属性。 如果Test类不是pojo类,那么ABC类也不是pojo类。
7.
这是一个特例
@Entity
class ABC{
--
}
@Entity是hibernate api或jpa api给出的注释,但我们仍然可以将这个类称为pojo类。 在这种例外情况下,带有来自technology/framework的注释的类称为pojo类。
您已经看到了上面的形式定义。
但不要太纠结于定义。 让我们来看看这里的意义。
JavaBeans are used in Enterprise Java applications, where users frequently access data and/or application code remotely, i.e. from a server (via web or private network) via a network. The data involved must therefore be streamed in serial format into or out of the users' computers - hence the need for Java EE objects to implement the interface Serializable. This much of a JavaBean's nature is no different to Java SE application objects whose data is read in from, or written out to, a file system. Using Java classes reliably over a network from a range of user machine/OS combinations also demands the adoption of conventions for their handling. Hence the requirement for implementing these classes as public, with private attributes, a no-argument constructor and standardised getters and setters.
Java EE应用程序还将使用作为javabean实现的类以外的类。它们可以用于处理输入数据或组织输出数据,但不能用于通过网络传输的对象。因此,上面的注意事项不需要应用于它们,除非它们是有效的Java对象。后面这些类被称为pojo——普通旧Java对象。
总而言之,您可以将Java bean视为适合在网络上使用的Java对象。
自1995年以来,软件世界中充斥着大量的炒作——其中不乏欺骗。
POJOS具有某些约定(getter/setter,公共无参数构造函数,私有变量),并且正在起作用(例如。用于按表单读取数据)是javabean。
推荐文章
- JavaBean和POJO之间的区别是什么?
- 注释在Java中如何使用,在哪里使用?
- 如何在Ubuntu下安装JDK 11 ?
- Spring Boot -无法确定数据库类型为NONE的嵌入式数据库驱动程序类
- 如何转换/解析从字符串到字符在java?
- 如何在Android中动态更改菜单项文本
- 如何比较两个没有时间部分的日期?
- 如何在Java中找到给定类的所有子类?
- 匿名类的访问构造函数
- 从Java访问Kotlin扩展函数
- 解析LocalDateTime时无法从TemporalAccessor获取LocalDateTime (Java 8)
- 以AM/PM的12小时格式显示当前时间
- 求两个集合的差值
- Junit @Rule如何工作?
- SSL握手警告:unrecognized_name错误,因为升级到Java 1.7.0