Ir al contenido principal

Definición y obtención de servicios con Spring

Una de las múltiples características del framework Spring es la inyección de dependencias. Mediante la misma, podemos definir los beans que implementan la lógica de nuestras aplicaciones. De esta forma nos podemos olvidar de la gestión de los mismos puesto que Spring lo hará por nosotros.

Hay varias formas de definir nuestros beans:


  • Directamente los definimos en nuestro fichero de contexto de Spring (applicationContext.xml) mediante etiquetas <bean>. En la definición del mismo podemos asignarle al mismo otros beans  que hayamos definido o propiedades (tanto simples como complejas como listas o maps).




  • También podemos definirlos mediante anotaciones del tipo @Service("nombreServicio") en la propia clase de nuestro servicio. Lo único que deberemos añadir a nuestro fichero de contexto son las siguientes entradas para indicar a Spring en qué paquete encontrar las clases que contienen anotaciones.
    


















Nuestra clase tendría un aspecto parecido al siguiente:


package es.jpascu.app.service;

import org.springframework.stereotype.Service;

@Service("miServicio")

public class MiServicio {
...
}

Una vez que hemos definidos nuestros beans debemos obtenerlos para ejecutarlos desde nuestra aplicación web. Hay diferentes formas de obtener los servicios dependiendo de donde queramos obtenerlos dentro de nuestra aplicación web:


  • Acceso genérico desde una aplicación Web.
WebApplicationContext springCtx = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext() );
ClaseDeBean miBean = ( ClaseDeBean )springCtx.getBean( "idDelBean" );
  • Acceso desde un servlet. Primero debemos definir el servlet en nuestro applicationContext.xml e inyectarle los beans a los que queramos acceder desde el mismo.









Una vez hecho esto el bean se obtendrá de la siguiente forma:

SolicitudService sService = ( SolicitudService) request.getSession().getServletContext().getAttribute( "solicitudService" );

  • Acceso desde un Job de Quartz. 
protected static final String APPLICATION_CONTEXT_KEY = "applicationContext";
ApplicationContext springCtx = ApplicationContext)context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY);
ClaseDeBean miBean = ( ClaseDeBean )springCtx.getBean( "idDelBean" );
  • Acceso desde un contexto personalizado. Personalmente utilizo está forma cuando necesito acceder a un bean del contexto desde una simple clase Java, siendo esta clase la implementación de un Web Service. Lo primero que hago es crear una clase que representa mi contexto y que implementa la interfaz ApplicationContextAware. 
  • package es.jpascu.app.utils;
     import org.apache.log4j.Logger;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    /**
    * Wrapper to always return a reference to the Spring Application Context from
    * within non-Spring enabled beans. Unlike Spring MVC's WebApplicationContextUtils
    * we do not need a reference to the Servlet context for this. All we need is
    * for this bean to be initialized during application startup.
    */
    
    public class SpringApplicationContext implements ApplicationContextAware {
    
    private static ApplicationContext CONTEXT;
    private static Logger logger = Logger.getLogger(SpringApplicationContext.class);
    
    /**
    * This method is called from within the ApplicationContext once it is 
    * done starting up, it will stick a reference to itself into this bean.
    * @param context a reference to the ApplicationContext.
    */
    public void setApplicationContext(ApplicationContext context) throws BeansException {
    logger.info("SetApplicationContext " + context);
    CONTEXT = context;
    }
    /**
    * This is about the same as context.getBean("beanName"), except it has its
    * own static handle to the Spring context, so calling this method statically
    * will give access to the beans by name in the Spring application context.
    * As in the context.getBean("beanName") call, the caller must cast to the
    * appropriate target class. If the bean does not exist, then a Runtime error
    * will be thrown.
    * @param beanName the name of the bean to get.
    * @return an Object reference to the named bean.
    */
    public static Object getBean(String beanName) {
    return CONTEXT.getBean(beanName);
    }
    }
    


       Después definiremos este bean en nuestro fichero applicationContext.xml:


        Por último, obtenemos nuestro bean de la siguiente forma:



SpringApplicationContext.getBean("miServicio");




  • Acceso desde una pantalla Flex. También se puede invocar un servicio de Spring desde una pantalla de Flex, puesto que hay varios productos que integran Flex con Java. Algunos son de pago (Exadel Flamingo) y otros son gratuitos (BlazeDS). Primero lo definimos como un objeto remoto indicando sus métodos:




  


         Posteriomente lo podemos utilizar desde nuestro código en Action Script:

         

MiServicio.ejecutar();

Comentarios

  1. Siento corregirte pero Exadel Flamingo no es de pago, ya que forma parte de Exadel Community and Open Source Projects. http://exadel.org/

    ResponderEliminar
  2. Gracias, me ayudo mucho el SpringApplicationContext!

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de