2012-04-11 1 views
20

Ho un servizio Grails che è un wrapper su un oggetto Singleton piuttosto complicato. Mi piacerebbe fare un po 'di inizializzazione per popolare il singleton all'avvio del servizio. Sarebbe bello se esistesse una sorta di funzione init() che verrebbe automaticamente chiamata dal servizio all'avvio, ma non ho trovato nulla di simile.Come posso chiamare una funzione di inizializzazione su un servizio Grails?

C'è un modo pulito per farlo?

+0

si intende una classe di servizio effettivo? – hvgotcodes

+0

Sì, una classe di servizio. –

risposta

29

È possibile implementare InitializingBean come descritto da @Saurabh, ma che gli incendi piuttosto presto nel processo di avvio Grails, così mentre funziona, l'sono alcune cose che hanno vinto essere ancora disponibili, ad esempio non è possibile chiamare i metodi GORM nelle classi di dominio perché ciò accade dopo l'inizializzazione del bean. Se InitializingBean non è sufficiente, è possibile chiamare un metodo di inizializzazione da BootStrap.groovy, ad es.

class BootStrap { 

    def myService 

    def init = { servletContext -> 
     myService.initialize() 
    } 
} 

e si può chiamare il metodo initialize o quello che volete nella classe di servizio. È anche possibile eseguire il lavoro di inizializzazione direttamente in BootStrap se non si desidera quel codice nella classe di servizio.

+0

Avrò bisogno di quei metodi GORM, quindi immagino che questo sia il modo migliore. –

+0

Grazie per la tua spiegazione. Sì, ha senso usare BootStrap.groovy per l'inizializzazione. – Saurabh

+0

La chiamata da Bootstrap è una soluzione eccellente e consente di controllare l'ordine di inizializzazione dei servizi. Detto questo, penso che l'annotazione @PostConstruct sia meno codice se non hai bisogno di trovare il controllo della grana. – alcoholiday

11

Server può implementare InitializingBean a fare un po 'di inizializzazione

public class AbcService implements InitializingBean { 

    public void afterPropertiesSet() throws Exception { 

    //initialization logic goes here 
    } 

    }  
} 
+0

GORM non sarà disponibile InitializingBean .. Se si desidera utilizzare Gorm, inserire la logica di inizializzazione in Bootstrap.groovy .. – Saurabh

+0

Ho bisogno di lavorare sui dati iniettati sul bean, nessun servizio esterno quindi preferisco avere la logica di inizializzazione e " chiama "all'interno dello stesso oggetto piuttosto che chiamarlo in bootstrap – zetta

20

Io uso l'annotazione PostConstruct di serie:

class MyService {  

    @PostConstruct 
    def init() { 
     // GORM accesible from here 
    } 

} 
+0

Ecco un collegamento: http://www.intelligrape.com/blog/2012/08/27/using-postconstruct-annotation-with-grails-services/ – alcoholiday

+0

Link aggiornato: http: // www.tothenew.com/blog/using-postconstruct-annotation-with-grails-services/ –