Java Bean 规范定义在 JavaBeans Specification 中。该规范是 Sun Microsystems(现在是 Oracle Corporation)在 1996 年发布的,用于定义 Java Bean 的特性、命名约定和组成方式,以便于 Java 开发人员编写可重用的、可扩展的和可组合的组件。该规范主要包括以下内容:
- 类型约定:Java Bean 类必须是公共的、序列化的,并且有默认的无参构造方法。
- 属性约定:Java Bean 类中的属性(Property)必须通过 getter 和 setter 方法来访问和修改。
- 事件约定:Java Bean 类必须支持事件处理机制,即可以向外部发布事件,也可以监听外部事件。
- 持久化约定:Java Bean 类必须支持持久化(Persistence),即可以将 Bean 的状态保存到外部存储介质中,也可以从外部存储介质中加载 Bean 的状态。
- 自省(Introspection)约定:Java Bean 类必须支持自省,即可以通过反射机制来获取 Bean 的属性和事件信息。
Java Bean 规范的目的是为了提高 Java 组件的可重用性和可组合性,使得 Java 开发人员可以更加方便地创建和使用组件。
Java Bean 出现之前
在 Java Bean 出现之前,通常使用的是简单的数据结构来存储数据,例如数组、结构体等。这种方式存在一些问题,例如:
- 数据结构不够灵活,只能存储固定类型的数据,不能存储多种类型的数据。
- 数据结构没有封装性,数据的访问权限不够严格,容易发生数据的不一致性。
- 缺乏与其他组件的交互能力,需要手动编写大量的代码来完成数据的传递和转换。
public class Person {
private String[] info = new String[2];
public Person() {}
public Person(String name, int age) {
info[0] = name;
info[1] = String.valueOf(age);
}
public String getName() {
return info[0];
}
public void setName(String name) {
info[0] = name;
}
public int getAge() {
return Integer.parseInt(info[1]);
}
public void setAge(int age) {
info[1] = String.valueOf(age);
}
}
在上面的代码中,Person 类使用了一个长度为 2 的字符串数组来存储人的姓名和年龄。它提供了一个默认构造方法和一个带参数的构造方法,以及四个访问方法。
Java Bean 的出现之后
解决了上述问题,它将数据封装在一个对象中,并提供了一系列的访问方法和事件机制,使得数据的访问和操作更加灵活和安全。Java Bean 还可以通过实现 Serializable 接口来支持对象的序列化和反序列化,从而实现数据的持久化和网络传输。
下面是 Java Bean 的一个简单示例:
public class Person {
private String name;
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
完整例子
以下是一个简单的 Java Bean 类的示例代码,用于演示 Java Bean 规范中的 5 个特性:
import java.io.Serializable;
import java.util.EventListener;
// Java Bean 类必须是公共的、序列化的,并且有默认的无参构造方法
public class UserBean implements Serializable {
private String name; // Java Bean 类中的属性必须通过 getter 和 setter 方法来访问和修改
private int age;
private boolean married;
public UserBean() {
super();
}
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;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
// Java Bean 类必须支持事件处理机制,即可以向外部发布事件,也可以监听外部事件
public void addEventListener(EventListener listener) {
// 添加事件监听器的代码
}
public void removeEventListener(EventListener listener) {
// 移除事件监听器的代码
}
// Java Bean 类必须支持持久化(Persistence),即可以将 Bean 的状态保存到外部存储介质中,也可以从外部存储介质中加载 Bean 的状态
public void saveToDatabase() {
// 将 Bean 的状态保存到数据库中的代码
}
public void loadFromDatabase() {
// 从数据库中加载 Bean 的状态的代码
}
// Java Bean 类必须支持自省,即可以通过反射机制来获取 Bean 的属性和事件信息
public PropertyDescriptor[] getPropertyDescriptors() {
// 获取 Java Bean 的属性信息的代码
}
public EventSetDescriptor[] getEventSetDescriptors() {
// 获取 Java Bean 的事件信息的代码
}
}
Java Bean 与面向对象
使用面向对象的编程思想来设计类和对象是 Java Bean 的核心思想之一。Java Bean 定义了一些规范,例如提供默认构造方法、属性使用私有的 get/set 方法以及实现可序列化接口等,这些规范可以使得 Java Bean 更加灵活、可复用和易于维护。因此,Java Bean 与面向对象的编程思想密切相关,两者之间存在着很多相似的地方。