2009-02-22 10 views

Répondre

15

Vous pouvez obtenir une référence à la applicationContext de partout (y compris la fermeture de détruire BootStrap) en utilisant ce morceau de code:

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

Obtenir une référence à un haricot est aussi facile que ctx.beanName.

Voici une petite classe util (écrit en Java) qui peut simplifier cette tâche:

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

} 

et un exemple:

def bean = SpringUtil.getBean("beanName") 

Cheers, Sigi

2

Hmm, je ne trouve aucun exemple de personne, même en utilisant la fermeture de bloc détruire dans Bootstrap. A partir de la documentation:

 
    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 

Comme une supposition, je dois dire que le ServletContext a déjà été détruite avant la {{}} détruire la fermeture de Bootstrap est exécutée, de sorte que bean vous essayez d'accéder est déjà parti. Quelqu'un peut-il confirmer?

6

Je sais que je m tout en retard ici et tous, mais depuis que je l'ai trouvé via Google ...

Votre classe BootStrap obtient je njected avec des haricots de printemps par son nom, comme tous les services et contrôleurs et autres. Si vous voulez un haricot, il suffit de le définir par son nom et il apparaîtra. Sinon, défilez simplement grailsApplication et allez à grailsApplication.mainContext.getBean etc.

Questions connexes