我认为,我认为“Bean”是一个带有属性和getter / setter的Java类。据我所知,它相当于C结构。真的吗?
另外,bean和普通类之间是否存在真正的语法差异?有没有特殊的定义或界面?
基本上,为什么会有这个术语呢?
Serializable
接口是什么意思?
JavaBean只是一个standard
Serializable
。而已。这只是一个惯例。但是很多图书馆依赖它。
关于Serializable
,来自API documentation:
实现java.io.Serializable接口的类启用了类的可序列化。未实现此接口的类将不会将其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
换句话说,可序列化的对象可以写入流,因此文件,对象数据库,任何东西都可以。
此外,JavaBean与另一个类之间没有语法差异 - 如果类遵循标准,则该类是JavaBean。
它有一个术语,因为标准允许库以编程方式使用您以预定义方式定义的类实例来执行操作。例如,如果一个库想要传递你传递给它的任何对象,它知道它可以,因为你的对象是可序列化的(假设lib要求你的对象是适当的JavaBeans)。
关于问题的第二部分,序列化是一种持久性机制,用于将对象存储为一系列带符号的字节。不太正式,它存储对象的状态,以便您可以在以后通过反序列化来检索它。
Java Bean是一个java类[概念],应遵循以下约定:
它是一个可重用的软件组件。它可以将许多对象封装到一个对象中,这样就可以从多个位置访问同一个对象,这是向容易维护代码迈出的一步。
Java Bean本质上是一个类,将类分类为bean的是:
值得注意的是serialVersionUID字段对于维护对象状态很重要。下面的代码有资格作为bean:
public class DataDog implements java.io.Serializable {
private static final long serialVersionUID = -3774654564564563L;
private int id;
private String nameOfDog;
//The constructor should NOT have arguments
public DataDog () {}
/** 4. getter/setter */
// getter(s)
public int getId() {
return id;
}
public String getNameOfDog() {
return nameOfDog;
}
// setter(s)
public void setId(int id) {
this.id = id;
}
public void setNameOfDog(String nameOfDog) {
this.nameOfDog = nameOfDog;
}}
要理解JavaBean,您需要注意以下几点:JavaBean是一个概念性的东西,不能代表一类特定的东西
JavaBean是一个可以在可重用软件组件的操作中可视化的开发工具
JavaBean基于Sun JavaBeans规范,可以是可重用的组件。其最大的特点是可重用性。
关于bean概念的一点背景/更新。许多其他答案实际上具有但不是为什么它们的原因。
它们是早期在Java中发明的,作为构建GUI的一部分。它们遵循易于工具分离的模式,让它们创建属性面板,以便您可以编辑Bean的属性。通常,Bean属性表示屏幕上的控件(Think x,y,width,height,text,..)
您还可以将其视为强类型数据结构。
随着时间的推移,这些对于许多使用相同类型访问的工具都很有用(例如,Hibernate将数据结构持久化到数据库)
随着工具的发展,他们更倾向于注释,而不是拉开setter / getter名称。现在大多数系统都不需要bean,它们可以使用任何带有注释属性的普通旧java对象来告诉它们如何操作它们。
现在我将bean视为带注释的属性球 - 它们实际上只对它们带有的注释有用。
豆本身并不是一种健康的模式。它们本质上破坏了封装,因为它们将所有属性暴露给外部操作,并且在使用它们时,有一种趋势(绝不是要求)创建代码来外部操作bean而不是在bean内部创建代码(违反“don”不要问对象的价值,让对象为你做点什么“)。使用带有最少getter和没有setter的带注释的pojos可以更好地恢复封装并具有不可变性的可能性。
顺便说一下,当所有这些事情发生时,有人将这个概念扩展到了一个名为Enterprise Java Beans的东西。这些......不同。而且它们很复杂,很多人觉得他们不理解整个Bean的概念,并且停止使用这个术语。我认为,这就是为什么你通常会听到被称为POJO的bean(因为每个java对象都是POJO,这在技术上是可以的,但当你听到有人说POJO时,他们通常会想到遵循bean模式的东西)
有一个术语让它听起来很特别。现实远没有那么神秘。
基本上,一个“豆”:
java.io.Serializable
,并且正确地执行了),即getFoo()
是“Foo”属性的getter),以及更新:
至于Serializable
:这只是一个“标记接口”(一个不声明任何函数的接口)告诉Java实现类同意(并暗示它有能力)“序列化” - 一个过程将实例转换为字节流。这些字节可以存储在文件中,通过网络连接发送等,并且有足够的信息允许JVM(至少是知道对象类型的那个)稍后重建对象 - 可能在不同的实例中应用程序,甚至是整个其他机器!
当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是所有实例字段必须是原始类型(int,bool等),某些类的实例也可序列化,或标记为transient
,以便Java不会尝试包含它们。 (这当然意味着transient
字段将无法在流上行程中存活。具有transient
字段的类应准备好在必要时重新初始化它们。)
一个不能遵守这些限制的类不应该实现Serializable
(而且,IIRC,Java编译器甚至不会让它这样做。)
JavaBeans是遵循极其简单的编码约定的Java类。你所要做的就是去
java.io.Serializable
接口 - 保存对象的状态JavaBeans的属性
JavaBean是一个满足某些编程约定的Java对象:
Serializable
或Externalizable
JavaBeans的示例
@Entity
public class Employee implements Serializable{
@Id
private int id;
private String name;
private int salary;
public Employee() {}
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
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 getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Java Bean用于更少的代码和更多的工作方法...... Java Bean在整个Java EE中用作运行时发现和访问的通用契约。例如,JavaServer Pages(JSP)使用Java Bean作为页面之间或servlet和JSP之间的数据传输对象。 Java EE的JavaBeans Activation Framework使用Java Bean将MIME数据类型的支持集成到Java EE中。 Java EE Management API使用JavaBeans作为在Java EE环境中管理资源的工具的基础。
关于序列化:
在对象序列化中,对象可以表示为包含对象数据的字节序列,以及有关对象类型和对象中存储的数据类型的信息。
将序列化对象写入文件后,可以从文件中读取并反序列化,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。
用例子说明。
1. import java.io.Serializable
至于序列化,请参阅documentation。
私人领域
字段应该是私有的,以防止外部类轻松修改这些字段。使用usuagly getter / setter方法而不是直接访问这些字段。
3.构造函数
没有任何参数的公共构造函数。
4.山羊/塞特犬
用于访问和修改私有字段的getter和setter方法。
/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
/** 2. private fields */
private int id;
private String name;
/** 3. Constructor */
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
/** 4. getter/setter */
// getter
public int getId() {
return id;
}
public String getName() {
return name;
}
// setter
public void setId(int id) {
this.id = is;
}
public void setName(String name) {
this.name = name;
}
}
在跨多个服务器部署项目时,您会发现序列化非常有用,因为bean将被持久化并在它们之间传输。
根据维基百科:
有关更多信息,请访问此link.
Java Bean是一种标准,其基本语法要求已由其他答案清楚地解释。
但是,IMO,它不仅仅是一个简单的语法标准。 Java Bean的真正含义或预期用途是与标准周围的各种工具支持一起,以促进代码重用和基于组件的软件工程,即使开发人员能够通过组合现有组件(类)来构建应用程序,而无需编写任何代码(或只需编写一些胶水代码)。不幸的是,这种技术被业界低估和利用不足,可以从这个问题的答案中得知。
如果您阅读Oracle的tutorial on Java Beans,您可以更好地理解它。