java.beans 分析

来源:互联网 发布:淘宝客服外包 编辑:程序博客网 时间:2024/06/06 12:45

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 equals(String aName, EventListener a, EventListener b)

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 addPropertyChangeListener(String propertyName, PropertyChangeListener listener)

public void addPropertyChangeListener(PropertyChangeListener listener)

public PropertyChangeListener[] getPropertyChangeListeners(String propertyName)

public PropertyChangeListener[] getPropertyChangeListeners()

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 firePropertyChange(PropertyChangeEvent event)










0 0