Grails: Bootstrap kodunun destory kapanışında spring beans'e erişim?


6

Ben benim grails projenin Bootstrap.groovy içinde yok etme kapatma bir fasulye erişmeye çalışıyorum. Bunu nasıl başaracağınıza dair herhangi bir fikir var mı?

ServletContext'e erişimim yok gibi görünüyor ...?

15

Sen o kod öbek kullanmaktan (bootstrap yok kapatılması dahil) her yerden ApplicationContext bir başvuru edinebilirsiniz:

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

bir fasulye için bir referans ctx.beanName kadar kolaydır alınıyor.

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

} 

ve bir örnek:

def bean = SpringUtil.getBean("beanName") 

Alkış Sigi


2

Hmm, numaralı kullanarak Bootstrap'teki yok blok kapatmayı kullanan herhangi bir örnek bulamıyorum. Dokümanlar: bir tahmin olarak

 
    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 

, ben ServletContext'te zaten tahrip edilmiş olduğunu söylemek gerekir {{yok}} Bootstrap kapatılması yürütüldüğünde, bu fasulye böylece erişmeye çalıştığınız önce zaten gitti. Herkes onaylayabilir mi?


6

ben biliyorum İşte

bu görevi kolaylaştırabilirsiniz (Java ile yazılmış) küçük util sınıftır m geç burada ve tüm ama bunu Google'dan bu yana buldum ...

BootStrap sınıfınız Spring beans adıyla isimlendirildi, tıpkı tüm servisler, kontrolörler ve diğer şeyler gibi. Eğer bir fasülye istiyorsanız, sadece ismine göre tanımlayın ve ortaya çıkar. Aksi takdirde, sadece def grailsApplication ve grailsApplication.mainContext.getBean vb gidin