Diferencia entre revisiones de «Integrar Singletons En Spring»
(Página nueva: ¿Cómo declarar un objeto en Spring Framework que no tiene constructor público, y cuyas instancias se deben obtener a través de un método (como ser, una clase Singleton)?....) |
|||
(No se muestran 9 ediciones intermedias de 4 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | [[Category:Spring Framework]] | ||
¿Cómo declarar un objeto en [[Spring Framework]] que no tiene constructor público, y cuyas instancias se deben obtener a través de un método (como ser, una clase [[Singleton]])?. | ¿Cómo declarar un objeto en [[Spring Framework]] que no tiene constructor público, y cuyas instancias se deben obtener a través de un método (como ser, una clase [[Singleton]])?. | ||
− | |||
== La situación == | == La situación == | ||
Supongamos la siguiente clase [[Singleton]] (hey, existe un único Imperio Irken, todos de pie!): | Supongamos la siguiente clase [[Singleton]] (hey, existe un único Imperio Irken, todos de pie!): | ||
− | + | <code java> | |
public class ImperioIrken { | public class ImperioIrken { | ||
− | private static | + | private static ImperioIrken instance = new ImperioIrken(); |
private ImperioIrken() { } | private ImperioIrken() { } | ||
Línea 17: | Línea 17: | ||
//insertar métodos para controlar la población aquí... | //insertar métodos para controlar la población aquí... | ||
} | } | ||
− | + | </code> | |
== El problema == | == El problema == | ||
Línea 35: | Línea 35: | ||
Así, un factory para nuestro ImperioIrken quedaría: | Así, un factory para nuestro ImperioIrken quedaría: | ||
− | + | <code java> | |
public class ImperioIrkenFactoryBean implements FactoryBean { | public class ImperioIrkenFactoryBean implements FactoryBean { | ||
Línea 50: | Línea 50: | ||
} | } | ||
} | } | ||
− | + | </code> | |
Finalmente, en nuestro archivo de configuración declararemos a ImperioIrkenFactoryBean en lugar del bean original. Spring, al detectar que implementa la interfaz FactoryBean, invocará al método getObject() para obtener la instancia. | Finalmente, en nuestro archivo de configuración declararemos a ImperioIrkenFactoryBean en lugar del bean original. Spring, al detectar que implementa la interfaz FactoryBean, invocará al método getObject() para obtener la instancia. | ||
+ | <code xml> | ||
<beans> | <beans> | ||
<bean id="imperioIrken" class="ejemplo.ImperioIrkenFactoryBean" /> | <bean id="imperioIrken" class="ejemplo.ImperioIrkenFactoryBean" /> | ||
</beans> | </beans> | ||
+ | </code> | ||
Al pedirle a Spring que nos de una instancia de "imperioIrken" nos devolverá justamente una instancia de la clase ImperioIrken, creada a través del método ''getObject()'' de ImperioIrkenFactory. | Al pedirle a Spring que nos de una instancia de "imperioIrken" nos devolverá justamente una instancia de la clase ImperioIrken, creada a través del método ''getObject()'' de ImperioIrkenFactory. | ||
+ | |||
+ | == Ver también == | ||
+ | * [[Spring Framework]] |
Revisión actual del 12:48 26 ago 2009
¿Cómo declarar un objeto en Spring Framework que no tiene constructor público, y cuyas instancias se deben obtener a través de un método (como ser, una clase Singleton)?.
La situación
Supongamos la siguiente clase Singleton (hey, existe un único Imperio Irken, todos de pie!):
public class ImperioIrken { private static ImperioIrken instance = new ImperioIrken();
private ImperioIrken() { }
public static ImperioIrken getInstance() { return instance; }
//insertar métodos para controlar la población aquí... }
El problema
La clase ImperioIrken no tiene un constructor público. ¿Cómo podemos hacer para declararla en Spring, y así poder inyectarla a otros beans?
Obviamente, la primer solución sería no crear esta clase como Singleton (un patrón en desuso, dicho sea de paso). Sin embargo, esto no siempre es posible... ¿qué pasaría si la clase ImperioIrken no fuera nuestra, sino de un framework externo?
Con lo cual, vamos a tener que lidiar con este singleton de alguna manera.
La solución: la interfaz FactoryBean
Spring provee la interfaz org.springframework.beans.factory.FactoryBean. Los objetos que cumplan esta interfaz serán usados por spring como factory de otros objetos.
La interfaz tiene 3 métodos a implementar, de los cuales el método getObject() es el que deberá devolver la instancia de nuestro objeto en cuestión.
Luego, en el archivo de configuración, se declara el factory de nuestro bean en vez de la clase original.
Así, un factory para nuestro ImperioIrken quedaría:
public class ImperioIrkenFactoryBean implements FactoryBean {
public Object getObject() { return ImperioIrken.getInstance(); }
public Class getObjectType() { return ImperioIrken.class; }
public boolean isSingleton() { return true; } }
Finalmente, en nuestro archivo de configuración declararemos a ImperioIrkenFactoryBean en lugar del bean original. Spring, al detectar que implementa la interfaz FactoryBean, invocará al método getObject() para obtener la instancia.
<beans> <bean id="imperioIrken" class="ejemplo.ImperioIrkenFactoryBean" /> </beans>
Al pedirle a Spring que nos de una instancia de "imperioIrken" nos devolverá justamente una instancia de la clase ImperioIrken, creada a través del método getObject() de ImperioIrkenFactory.