2013-06-04 5 views
6

Mit Grails 2.2.1Wie RICHTIG Grails Dienste mit Spring resource.groovy

Ich habe folgende Grails Dienste definiert injizieren:

package poc 

class TestService { 
    def helperService 
} 

class HelperService { 
} 

Ich habe die Testservice wie folgt (resources.groovy) verwendet :

test(poc.TestService) { 

} 

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

Alles funktioniert, außer für die automatische Injektion des helperService, wie es erwartet wird, wenn der Dienst von Grails erstellen. Der einzige Weg, die ich bekommen kann es zu arbeiten, um es manuell wie folgt zu injizieren:

//added 
helper(poc.HelperService) { 
} 

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

Das Problem ist, dass es nicht auf die gleiche Weise wie die Injektion Grails tut. Mein tatsächlicher Service ist ziemlich komplex, und wenn ich alles manuell injizieren muss, einschließlich aller Abhängigkeiten.

+0

Grails-Dienste werden standardmäßig eingefügt, wenn die entsprechende Nomenklatur verwendet wird. Sie brauchen keinen Eintrag in 'resources.groovy' für Dienste. Was ist das Problem, vor dem Sie stehen? – dmahapatro

Antwort

9

Bohnen, die in resources.groovy deklariert werden, sind normale Frühlingsbohnen und nehmen standardmäßig nicht am Autowiring teil. Sie können dies tun, indem Sie die autowire-Eigenschaft auf sich ausdrücklich:

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

In Ihrem speziellen Fall, Sie brauchen nicht auf die Testservice Bean in Ihrem resources.groovy zu definieren, lediglich einen Verweis darauf einrichten von Ihrem jmsContainer Bohne wie so:

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

Dies wird in den "Grails and Spring" section of the Grails Documentation unter "Verweis auf vorhandene Beans" dokumentiert.

+0

Das Autowiren nach Namen wird auch nur für Bean-Eigenschaften ausgeführt, die mit der Annotation "@ Autowired" Spring gekennzeichnet sind –

Verwandte Themen