2013-06-04 19 views
6

Uso Grails 2.2.1Come iniettare CORRETTAMENTE servizi Grails usando Primavera resource.groovy

ho i seguenti servizi Grails definito:

package poc 

class TestService { 
    def helperService 
} 

class HelperService { 
} 

ho usato il TestService come segue (resources.groovy) :

test(poc.TestService) { 

} 

jmsContainer(org.springframework.jms.listener.DefaultMessageListenerContainer) { 
    connectionFactory = jmsConnectionFactory 
    destinationName = "Test" 
    messageListener = test 
    autoStartup = true 
} 

Tutto funziona tranne che per l'iniezione automatica del helperService, in quanto si prevede quando il servizio creare da Grails. L'unico modo per farlo funzionare è quello di iniettare manualmente come segue:

//added 
helper(poc.HelperService) { 
} 

//changed 
test(poc.TestService) { 
    helperSerivce = helper 
} 

Il problema è che non sta iniettando allo stesso modo come fa Grails. Il mio servizio effettivo è piuttosto complesso e se dovrò iniettare tutto manualmente, incluse tutte le dipendenze.

+0

I servizi Grails vengono iniettati per impostazione predefinita se viene utilizzata la nomenclatura appropriata. Non è necessario entrare in 'resources.groovy' per i servizi. Qual è il problema che stai affrontando? – dmahapatro

risposta

9

I bean dichiarati in resources.groovy sono normali bean Spring e non partecipano automaticamente all'autowiring. È possibile farlo impostando la proprietà autowire su di loro in modo esplicito:

aBean(BeanClass) { bean -> 
    bean.autowire = 'byName' 
} 

Nel vostro caso specifico, non è necessario definire il fagiolo TestService nel vostro resources.groovy, semplicemente impostare un riferimento ad esso dal vostro jmsContainer fagiolo in questo modo:

jmsContainer(org.springframework.jms.listener.DefaultMessageListenerContainer) { 
    connectionFactory = jmsConnectionFactory 
    destinationName = "Test" 
    messageListener = ref('testService') // <- runtime reference to Grails artefact 
    autoStartup = true 
} 

Questo è documentato nel "Grails and Spring" section of the Grails Documentation sotto "Riferimento fagioli esistenti".

+0

Inoltre, l'autowiring per nome verrà eseguito solo sulle proprietà del bean contrassegnate dall'annotazione Spring '@ Autowired' –

Problemi correlati