JavaBeans让使用组件更加容易,软件开发者可以使用其他人开发的组件,而不必关心其可预测的内部行为。
JavaBean对于刚刚接触的人很容易上手,但是深究起来也是蛮复杂的,
如流化与重建、持久化为XML文件、为定制类型创建编辑器组件等。
https://docs.oracle.com/javase/tutorial/javabeans/
满足下面编程习惯的JAVA类,都是JavaBean:
1 所有的属性都是私有的,公有的getter和setter;
2 必须有一个无参的公有构造函数(无参创建,保证创建与配置的灵活性);
3 实现序列化接口( java.io.Serializable,是一个语义识别接口,其中没有任何方法、域、服务。
只表明该实现类有转化实例到字节流的能力 ,并能通过网络进行传输、或是存储在文件中等。
虚拟机可以根据字节流中的信息,在任何地方,重建被流化的对象实例。
如果一个类实现了序列化接口,那么它的类属性必须是简单类型、可序列化的对象、或是transient类型。
bean的这种 流化-传输-重构的特性,赋予了JAVA企业应用无限的可能性)。
JavaBean的属性、域、状态信息都可被流化,可以定制那些成员被流化,有3种流化控制方式:
3.1 实现Serializable接口进行自动流化,使用JAVA对象序列化工具或是说序列化软件对所有的non-static, non-transient域自动的进行流化。
3.2通过实现writeObject 或是 readObject,实现自动流化无法处理的更加复杂的对象如何被流化,也可以添加非成员数据进行流化。
3.2 实现接口Externalizable进行定制文件格式的序列化,可以完全控制流化。
使用private staticfinal ObjectStreamField[]属性,
1class PropertyChangeSupport implements Serializable
监听器集合列表被它管理。在订阅属性改变时,它们会被通知。
它是线程安全的,有3个主要的功能:订阅监听器、取消订阅、发布消息。
因为监听器直接不是线程安全的,所以调用者在发布属性改变事件时,需要注意线程安全问题。
1.1属性分析
private staticfinal ObjectStreamField[]serialPersistentFields指定需要流化的属性及其顺序。
privatetransient Object sourceBean;事件源,监听器监听该源的一个或多个属性是否改变。
private transient List<PropertyChangeListener>listeners监听器列表。对于其中的任何一个监听器,
在源的被订阅属性改变时,它将被通知。
1.2 通用函数
public PropertyChangeSupport(Object sourceBean)构造函数
private boolean
private void writeObject(ObjectOutputStream out)throwsIOException 非默认序列化函数
private void readObject(ObjectInputStream in)throws IOException,ClassNotFoundException 非默认序列化函数
1.3监听器管理 :在任何参数为null或是没有订阅该属性时,没有任何影响
public void removePropertyChangeListener(String propertyName, PropertyChangeListenerlistener)
public void removePropertyChangeListener(PropertyChangeListener listener)移除该监听器对源的所有属性的监听
public void
public void
public
public
public boolean hasListeners(String propertyName)
1.4事件触发 :构造函数的参数作为事件源,如果sourceBean的属性propertyName的旧值和新值都不等于null并且相等,则事件不会触发。
T= Object,boolean,int
public void firePropertyChange(String propertyName, T oldValue,T newValue)发起PropertyChangeEvent事件。
public void fireIndexedPropertyChange(String propertyName,int index,T oldValue, T newValue)发起IndexedPropertyChangeEvent事件
public void