2009-02-22 4 views

답변

15

당신은 코드의 덩어리를 사용 (부트 스트랩의 파괴 폐쇄 포함) 모든 곳에서의 ApplicationContext에 대한 참조를 얻을 수 있습니다

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

빈에 대한 참조 ctx.beanName로 쉽게 얻기.

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") 

이 건배, SIGI

2

흠, 심지어 을 예로 들자면 부트 스트랩의 파괴 블록 폐쇄를 사용합니다. 워드 프로세서에서 : 추측으로

 
    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를 이미 파괴되었다는 말을하려는 {{파괴}} 부트 스트랩의 폐쇄가 실행되고, 그 콩 있도록 액세스하려는 전에 이미 사라졌습니다. 누구든지 확인할 수 있습니까?

6

내가 '알고 여기

이 작업을 단순화 할 수 있습니다 (자바로 작성된) 작은 폴더의 유틸리티 클래스입니다 모든 늦게 여기 있어요 모든하지만 구글을 통해이 발견 이후 ...

부트 스트랩 클래스는 난을 얻는다 모든 서비스와 콘트롤러 같은 것들과 마찬가지로, 이름으로 Spring 빈을 사용하지 않았다. 빈을 원한다면 이름으로 정의하면 나타납니다. 그렇지 않다면, grailsApplication을 해제하고 grailsApplication.mainContext.getBean 등으로 가십시오.

관련 문제