Grails: ¿Accediendo a los frijoles primaverales en el cierre automático del código de Bootstrap?


6

Estoy buscando acceder a un frijol en mi cierre de destrucción en el proyecto Bootstrap.groovy of my grails. ¿Alguna idea sobre cómo lograr esto?

Parece que no tengo acceso a servletContext ...?

15

Puede obtener una referencia a la applicationContext de todas partes (incluyendo el cierre de destruir BootStrap) usando ese trozo de código:

def ctx = org.codehaus.groovy.grails.web.context.ServletContextHolder.servletContext.getAttribute(org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes.APPLICATION_CONTEXT); 

obteniendo una referencia a un bean es tan fácil como ctx.beanName.

Aquí está una pequeña clase util (escrito en Java) que puede simplificar esta tarea:

import org.springframework.context.ApplicationContext; 
import org.codehaus.groovy.grails.web.context.ServletContextHolder; 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes; 

public class SpringUtil { 

    public static ApplicationContext getCtx() { 
     return getApplicationContext(); 
    } 

    public static ApplicationContext getApplicationContext() { 
     return (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT); 
    } 

    @SuppressWarnings("unchecked") 
    public static <T> T getBean(String beanName) { 
     return (T) getApplicationContext().getBean(beanName); 
    } 

} 

y un ejemplo:

def bean = SpringUtil.getBean("beanName") 

Cheers, Sigi


2

Hmm, No puedo encontrar ningún ejemplo de alguien incluso usando el cierre de bloque de destrucción en Bootstrap. A partir de los documentos:

 
    It is not guaranteed that {{destroy}} will be called unless the 
application exits gracefully (for example by using the application 
server's shutdown command) so don't rely on it too much 

Como una suposición, que tendría que decir que el ServletContext ya ha sido destruida antes del {{destruir}} se ejecuta el cierre de Bootstrap, por lo que el frijol que está tratando de acceder ya se ha ido. ¿Alguien puede confirmar?


6

sé yo' Estoy todo tarde aquí y todo, pero desde que encontré esto a través de Google ...

Su clase BootStrap me lo da inyectado con Spring beans por nombre, al igual que todos los servicios y controladores y esas cosas. Si quieres un frijol, solo defínalo por tu nombre y aparecerá. De lo contrario, defina grailsApplication y vaya a grailsApplication.mainContext.getBean, etc.