6.4 JavaBeans组件
JavaBeans是Java平台上的组件模型。要在Java平台上创建可复用的组件,应该遵循JavaBeans的规范。对于JavaBeans组件,开发人员比较熟悉的是Java EE中的EJB(Enterprise JavaBeans),以及Java类中遵循JavaBeans命名规范的属性获取和设置的方法。JavaBeans的强大之处在于以规范的组件模型作为基础,可以通过工具很方便地进行单个组件的自定义和多个组件的组装等操作。对于所有遵循JavaBeans规范的组件,都可以通过工具以统一的方式来进行操作。
符合JavaBeans规范的每个组件都包含3类信息,分别是属性、方法和事件。属性指的是一个组件暴露出来的外观或行为上的特征。可以通过改变属性的值来定制组件的外观或行为。JavaBeans组件的方法与一般的Java方法并没有区别,可以在其他组件中调用。事件是组件之间进行交互的方式。某个组件可以发布事件,而另外的组件可以在这个事件上注册监听器。
6.4.1 获取组件信息
一个JavaBeans组件可以通过java.beans.Introspector类来获取组件中的属性、方法和事件的信息,使用的是Introspector类中的静态方法getBeanInfo。该方法的返回值是包含了组件相关信息的java.beans.BeanInfo接口的实现对象。获取组件信息的方式可能有两种,一种是开发人员自己提供的BeanInfo接口的实现类,另外一种是由系统通过反射API来自动发现组件中的信息。对于第一种方式,系统会根据固定的名称模式来查找组件对应的BeanInfo接口的实现类。比如,对于类名为“com.java7book.My”的组件,查找类名为“com.java7book.MyBeanInfo”的BeanInfo接口的实现类作为组件的信息来源。如果没有找到相关实现类,会使用第二种方式,即通过反射API来发现相关信息。这两种方式的一个重要区别在于,在找到BeanInfo接口的实现类之后,不会再继续查找该组件的父类来获取信息;而通过反射API的方式则会沿着继承层次结构树一直向上查找父类中的相关信息。
对于具体的组件信息的获取过程,getBeanInfo方法也提供了不同的重载方式供开发人员进行配置。可以配置的内容主要有两个,一个是在获取过程中包含哪些类中的信息。前面提到过,组件的父类中的信息有可能被包含进来,如果不希望包含组件的某些父类中的信息,那么可以指明终止组件信息获取过程的类名。当沿着继承层次结构树向上获取时,如果遇到指定的终止类,就停止继续获取。另外一个可配置的内容是对找到的BeanInfo接口实现类的处理方式。在getBeanInfo方法中允许设置3种不同的处理方式,对应的参数值分别是使用所有BeanInfo接口实现类的USE_ALL_BEANINFO、忽略组件类对应的BeanInfo接口实现类的IGNORE_IMMEDIATE_BEANINFO和忽略包括组件类的父类在内的所有BeanInfo接口实现类的IGNORE_ALL_BEANINFO。
通过这两种配置方式,可以很好地控制组件信息的获取过程。不过在Java 7之前,这两种配置方式不能同时使用,只能使用其中一种。Java 7添加了额外的getBeanInfo的重载方式。代码清单6-18给出了getBeanInfo方法的使用示例。MyBean是要获取信息的组件类,ParentBean是MyBean的父类。getBeanInfo方法调用表明获取信息时不考虑ParentBean类的信息,同时忽略所有的BeanInfo接口的实现类。
代码清单6-18 getBeanInfo方法的使用示例
public void introspect()throws IntrospectionException{
BeanInfo beanInfo=Introspector.getBeanInfo(MyBean.class, ParentBean.class, Introspector.IGNORE_ALL_BEANINFO);
outputBeanInfo(beanInfo);
}