Grails: Acceso a los granos de la primavera en el cierre Destory del código de arranque?
-
05-09-2019 - |
Pregunta
Estoy buscando para acceder a un bean en mi cierre de destruir en el Bootstrap.groovy de mi proyecto griales. Cualquier ideas sobre cómo lograr esto?
Me parece que no tienen acceso a ServletContext ...?
Solución
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);
Obtener 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")
Saludos, Sigi
Otros consejos
Sé que soy todo tarde aquí y todos, pero desde que me encontré por Google ...
Su clase BootStrap se inyecta con granos de primavera por su nombre, al igual que todos los servicios y controladores y esas cosas. Si quieres un frijol, simplemente def por su nombre y que va a aparecer. De lo contrario, simplemente def grailsApplication e ir a grailsApplication.mainContext.getBean etc.
Hmm, no puedo encontrar ningún ejemplo de que alguien incluso usando el cierre bloque de destruir 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 acceso se ha ido ya. Alguien puede confirmar?