Introducción
Los JavaBeans definen un modelo de componentes potente y simple para Java. El objetivo de los JavaBeans es proporcionar
unas unidades reutilizables y autosuficientes que los desarrolladores puedan manipular mediante programación o que las
herramientas de construcción puedan manipular de forma visual.
Los JavaBeans pueden ser controles de interfaz gráfica de usuario o pueden no tener representación visual alguna. Los
controles de interfaz gráfica de usuario en Java habitualmente son JavaBeans para que las herramientas de construcción
puedan manipularlos. En J2EE, los JavaBeans sencillos se utilizan habitualmente desde JSP, donde proporcionan una
separación de la presentación en HTML y el código Java, que lo contienen los JavaBeans.
Un JavaBean es una clase Java con tres características distintivas:
Propiedades de los JavaBean
Otros componentes pueden acceder a las propiedades de un JavaBean. Normalmente, una propiedad corresponde a un valor
privado al que se accede mediante los métodos setter y getter, pero también puede ser un valor calculado. La
actualización de propiedades puede dar lugar a algunos efectos colaterales.
Los accesores son métodos para acceder a las propiedades. Los accesores pueden ser getter o setter, y siguen los
siguientes convenios de denominación:
void setNombre_propiedad(Tipo_propiedad valor); // setter
Tipo_propiedad getNombre_propiedad() // getter
Para una propiedad booleana, un método getter podría ser:
boolean isNombre_propiedad() // getter para una propiedad booleana
Ejemplo: Bean Customer
A continuación se muestra un ejemplo de un JavaBean simple (Customer) con dos propiedades simples: name y email.
Observe que las propiedades se definen mediante parejas de métodos set/get.
public class Customer {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String aName) {
name = aName;
}
public String getEmail() {
return email;
}
public void setEmail(String aEmail) {
email = aEmail;
}
}
JavaBeans simples como el del ejemplo se utilizan a menudo en JSP, ya que ofrecen la posibilidad de transportar valores
de formularios en páginas web.
Propiedades indexadas
Junto con las propiedades simples, que tienen un único valor, una propiedad puede ser un conjunto de valores dentro de
una matriz.
Las propiedades indexadas permiten devolver un valor de la matriz con el índice especificado o bien toda la matriz de
valores.
Las propiedades indexadas tienen las siguientes firmas:
void setNombre_propiedad(int índice, Tipo_propiedad valor); // setter indexado
Tipo_propiedad getter(int índice); // getter indexado
void setNombre_propiedad(Tipo_propiedad valores[]); // setter de matriz
Tipo_propiedad[]getNombre_propiedad(); // getter de matriz
Propiedades vinculadas
El mecanismo de propiedad vinculada proporciona un aviso un servicio de notificación cuando la propiedad cambia. Los
objetos a los que interesa ser avisados del cambio se deben registrar anticipadamente y, cuando la propiedad cambia, se
envía una notificación a los objetos registrados. Habitualmente, esta notificación se realiza mediante un suceso que el componente desencadena con la propiedad vinculada después de que se
haya establecido la propiedad.
Un JavaBean con una propiedad vinculada expone métodos de registro y anulación del registro de los objetos interesados,
denominados escuchas. Los desarrolladores pueden definir su propio mecanismo de notificación, sin embargo, las
bibliotecas Java proporcionan varias clases de soporte en el paquete java.beans que se utilizan de forma
habitual.
Propiedades restringidas
Las propiedades restringidas son similares a las propiedades vinculadas, sin embargo, la notificación se da antes que
se establezca realmente la propiedad. De esta forma se consigue que quien esté interesado pueda no permitir el cambio
de la propiedad mediante el lanzamiento de PropertyVetoException.
Sucesos y notificación
Los sucesos son una característica de los JavaBeans que permite que los componentes desarrollados de forma
independiente se puedan comunicar entre sí mediante la propagación de la información acerca de su estado. En este
modelo, algunos componentes desencadenan sucesos, que otros componentes manejan, desempeñando el rol de escuchas de
sucesos.
Para poder dar soporte a este modelo de comunicación, el modelo de componentes de JavaBeans proporciona:
-
Propiedades que pueden desencadenar sucesos (propiedades vinculadas y restringidas).
-
Métodos de registro, de forma que los escuchas se puedan registrar por sí mismos.
-
Sucesos, que llevan la información sobre el cambio.
-
Escuchas, que pueden reaccionar en relación con el suceso entregado.
El siguiente diagrama de clase ilustra estos conceptos para un JavaBean denominado EventSource con una propiedad
int simple.
Durante la configuración, determinados escuchas se registran con el JavaBean. Posteriormente, algún otro objeto llama
al método setProperty, que iniciará el proceso de notificación mediante la creación del objeto de suceso. El
JavaBean EventSource invocará al método propertyChange en todos los escuchas registrados. Los escuchas de
sucesos recibirán el suceso, leerán sus valores y reaccionarán en relación con dicho suceso.
En el siguiente diagrama de acontecimientos se muestra el orden en el que se realizan las invocaciones:
La notificación de los escuchas se realiza de forma síncrona en relación con la instancia del JavaBean, que es el
origen del suceso, sin embargo el escucha de sucesos puede realizar el proceso de los sucesos en otra hebra.
Introspección
La introspección es un mecanismo de tiempo de ejecución que habilita la detección de propiedades, sucesos y métodos de un JavaBean.
Los programas y las herramientas de desarrollo utilizan la introspección para no utilizar dependencias codificadas por
programa en otros componentes. La introspección se logra mediante la reflexión y un conjunto de convenios de
denominación de métodos e interfaces. La clase BeanInfo da soporte a características adicionales de
introspección. Los convenios de denominación que se utilizan para la introspección a veces son denominados "patrones de
diseño", que no se deberían confundir con la noción de patrón de diseño en el diseño orientado a objetos.
Persistencia
Un JavaBean puede ser persistente mediante un mecanismo de serialización. La serialización puede ser automática o
personalizada dependiendo de si el JavaBean implementa una interfaz serializable o externalizable. JDK
1.4 presenta las clases XMLEncoder y XMLDecoder que se proporcionan para almacenar instancias de
JavaBeans en formato XML.
Personalización
La apariencia y comportamiento de un JavaBean se puede personalizar en el momento de diseñarlo. Esto es particularmente
importante con JavaBeans visuales que se utilizan en interfaces gráficas de usuario. La personalización se lleva a cabo
mediante un editor de propiedades o utilizando personalizadores. Los personalizadores proporcionan una interfaz de
usuario personalizada para configurar una instancia de JavaBean en el momento de diseñarlo.
Contexto de bean
El contexto de bean define una jerarquía de contención lógica que permite que los JavaBeans interroguen a su entorno
acerca de posibilidades y servicios. Los mecanismos de contexto de bean proporcionan el soporte para la jerarquía de
contención lógica y la búsqueda de servicios que los JavaBeans ofrecen en la jerarquía.
JavaBeans™ Activation Framework (JAF)
JAF (Java Activation Framework) es una ampliación Java estándar que permite determinar el tipo de un dato,
encapsularlo, o descubrir sus operaciones disponibles y crear instancias de un componente de software que corresponde a
la operación deseada en el dato.
Información adicional
Consulte la especificación de la API de JavaBeans, versión 1.01 en la página http://java.sun.com/ para obtener más información sobre los JavaBeans. Siga los enlaces Docs
& Training > Java 2 Platform, Standard Edition > Java 2 SDK, SE v1.3 documentation > JavaBeans >
JavaBeans Specification.
|