Grails: доступ к весенним бобам при закрытии кода Bootstrap? - PullRequest
6 голосов
/ 22 февраля 2009

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

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

Ответы [ 3 ]

15 голосов
/ 05 марта 2009

Вы можете получить ссылку на applicationContext отовсюду (включая уничтожение BootStrap), используя этот фрагмент кода:

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

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

Вот небольшой класс утилит (написанный на 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")

Приветствия, Сиги

6 голосов
/ 01 января 2010

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

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

2 голосов
/ 23 февраля 2009

Хм, я не могу найти примеров кого-либо, даже использующего закрытие блока уничтожения в 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 уже был уничтожен до выполнения {{destroy}} закрытия Bootstrap, так что бин, к которому вы пытаетесь получить доступ, уже исчез. Кто-нибудь может подтвердить?

...