Podemos pensar en el estado serializado de un objeto como una copia del objeto en una representaci�n diferente. Algunas veces no es apropiado almacenar esta representaci�n en el directorio. Esto es porque el estado serializado podr�a ser demasiado grande o podr�a ser inadecuado para nuestras necesidades (por ejemplo, la aplicaci�n podr�a necesitar m�s informaci�n que la que puede suministrarse desde la forma serializada). O, podr�amos necesitar el objeto en una forma diferente.
Por razones como estas, el JNDI define una referencia para usarla cuando la forma de un objeto serializado no puede almacenarse en el directorio. Almacenamos indirectamente un objeto con una referencia asociada en el directorio almacenando su referencia. Podr�a se �til pensar en la distinci�n entre un objeto serializado y una referencia JNDI como entre una copia de un objeto Java y una referencia a un objeto Java.
��Qu� hay en una Referencia?
Una referencia est� representada por la clase Reference.
Una Reference consta de una lista ordenada de direcciones e informaci�n de clases sobre el objeto que est� siendo referenciado. Cada direcci�n est� representada por una subclase de RefAddr y contiene informaci�n sobre c�mo construir el objeto.
Las referencias se usan normalmente para representar conexiones a un servicio de red como una base de datos, un directorio o un sistema de ficheros. Cada direcci�n podr�a identificar para ese servicio un punto final de comunicaci�n que contiene informaci�n sobre c�mo contactar con el servicio. Se podr�an alcanzr m�ltiples direcciones por varias razones, como la necesidad de reaplicaci�n o m�ltiples puntos de acceso (es decir, el objeto ofrece interfaces sobre m�s de un mecanismo de comunicaci�n).
Una referencia tambi�n contiene informaci�n para ayudar en la creacci�n de un ejemplar el objeto al que se refiere la referencia. Contiene el nombre de la clase Java de ese objeto, as� como el nombre de la clase y la localizaci�n de la factor�a de objetos a utilizar para crearlo.
�Objetos Referenciables
Un objeto cuya clase implementa el interface Referenceable tiene asociada una referencia. El interface Referenceable tiene un m�todo, getReference(), que devuelve la referencia al objeto.
El siguiente ejemplo muestra una clase Fruit que implementa el interface Referenceable.
public class Fruit implements Referenceable {
String fruit;
public Fruit(String f) {
fruit = f;
}
public Reference getReference() throws NamingException {
return new Reference(
Fruit.class.getName(),
new StringRefAddr("fruit", fruit),
FruitFactory.class.getName(),
null); // Factory location
}
public String toString() {
return fruit;
}
}
La referencia de un ejemplar Fruit consta de una s�la direcci�n (de la clase StringRefAddr).
Esta direcci�n contiene el tipo de fruta con el que fue creado este ejemplar.
Por ejemplo, si el ejemplar fue creado usando new Fruit("orange"), entonces su tipo de direcci�n ser�a "fruit" y el contenido de su diecci�n ser�a "orange". La referencia contiene dos informaciones m�s: el nombre totalmente cualificado de la clase Fruit (en este caso, simplemente "Fruit") y el nombre totalmente cualificado de la clase factor�a de objetos que puede usarse para crear ejemplares de Fruit (en este caso, "FruitFactory").
Las factor�as de objetos de describen en la lecci�n Factorias de Objetos.
�Unir un Objeto Referenciable
Podr�amos recordar la clase Fruit del ejemplo de A�adir una Uni�n que Tiene Atributos. El siguiente ejemplo es una simplificaci�n de aqu�l.
Despu�s de crear un ejemplar de Fruit, llamamos a Context.bind(), DirContext.bind(), Context.rebind(), o DirContext.rebind() para a�adirlo al directorio.
// Create the object to be bound
Fruit fruit = new Fruit("orange");
...
// Perform bind
ctx.bind("cn=favorite", fruit);
La implementaci�n del proveedor de servicio de bind()/rebind() primero extrae la referencia del objeto que est� siendo unido (usando Referenceable.getReference()) y luego almacena esa referencia en el directorio. Cuando posteriormente se busca ese objeto en el directorio, su factor�a de objetos correspondiente convertir� la referencia en un ejemplar del objeto (los detalles de la conversi�n se cubren en la lecci�n Factorias de Ojetos).
// Read the object back
Fruit f2 = (Fruit) ctx.lookup("cn=favorite");
System.out.println(f2);
Esto produce la siguiente salida, "orange", producida por Fruit.toString()
# java RefObj orange
Desde la perspectiva de la aplicaci�n que usa JNDI, s�lo est� tratando con bind() y lookup(). El proveedor de servicio tiene cuidado de obtener la referencia desde el objeto y convertirlo a/desde el propio objeto real.
Observa que podemos almacenar en el directorio un objeto Referenceable s�lo si el proveedor de servicios lo soporta. El proveedor de servicios LDAP de Sun soporta almacenamiento de objetos References y Referenceables.
�Unir una Referencia
Unir un objeto Referenceable es m�s elegante que unir directamente una Reference. Esto es porque podemos simplemente unir el objeto en vez de primero obtener su referencia. Sin embargo, tambi�n podemos unir una Reference directamente. Puedes ir a la secci�n Objetos Remotos para ver un ejemplo de uni�n de una Reference.