Grails: Zugreifen auf Spring Beans im Destory-Abschluss des Bootstrap-Codes?


6

Ich bin auf der Suche nach einer Bean in meiner Zerstörung Schließung in der Bootstrap.groovy meines Grails-Projekts. Irgendwelche Ideen, wie man das erreicht?

Ich habe keinen Zugang zu ServletContext ...?

15

Sie können einen Verweis auf die von überall application (einschließlich der Zerstörung Schließung von BootStrap) unter Verwendung dieses Stück Code erhalten:

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

ein Verweis auf eine Bohne bekommen so einfach wie ctx.beanName ist.

Hier ist eine kleine util Klasse (geschrieben in Java), die diese Aufgabe vereinfachen kann:

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); 
    } 

} 

und ein Beispiel:

def bean = SpringUtil.getBean("beanName") 

Cheers, Sigi


2

Hmm, ich kann keine Beispiele für alle selbst mit die Blocksperre in Bootstrap zu finden. Aus der Dokumentation:

 
    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 

Als Vermutung, würde ich sagen, dass die ServletContext bereits zerstört wurde, bevor die {{}} zerstören Schließung von Bootstrap ausgeführt wird, so dass die Bohnen sind Sie zugreifen möchten, ist schon weg. Kann jemand bestätigen?


6

Ich weiß, dass ich m alle spät hier und alle, aber seit ich das über Google gefunden habe ...

Ihre BootStrap Klasse bekommt ich mit Spring Beans nach Namen benannt, genau wie alle Dienste und Controller und so. Wenn du eine Bean willst, definiere sie einfach nach Namen und sie wird angezeigt. Ansonsten, einfach def grailsApplication und go to grailsApplication.mainContext.getBean usw.