Grails: Доступ к весенним бобам в закрытии ловушки кода Bootstrap?


6

Я ищу доступ к bean-компоненту в моем уничтожении закрытия в Bootstrap.groovy моего проекта grails. Любые идеи о том, как достичь этого?

У меня, похоже, нет доступа к servletContext ...?

15

Вы можете получить ссылку на ApplicationContext от везде (в том числе уничтожить закрытия Bootstrap), используя этот кусок кода:

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

Получение ссылки на бобе, так же легко, как ctx.beanName.

Вот небольшой Util класс (написанный на Java), что может упростить эту задачу:

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

} 

и пример:

def bean = SpringUtil.getBean("beanName") 

Cheers, Зиги


2

Хмм, я не могу найти ни одного примера никого, кроме , используя блокировку блока блокировки в Bootstrap. Из документов:

 
    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 

Как догадка, я должен был бы сказать, что ServletContext уже разрушена до {{}} уничтожить закрытие Bootstrap выполняются, так что боб вы пытаетесь получить доступ уже ушел. Может ли кто-нибудь подтвердить?


6

Я знаю, что я» m все здесь поздно и все, но так как я нашел это через Google ...

Ваш класс BootStrap получает i но с весенними бобами по имени, как и все сервисы и контроллеры и прочее. Если вы хотите bean-компонент, просто определите его по имени, и он появится. В противном случае просто определите grailsApplication и перейдите к grailsApplication.mainContext.getBean и т. Д.