2011-09-08 14 views
7

Mam aplikację Grails, która musi uruchomić strategię, która prawdopodobnie zostanie zamieniona w czasie. Wiem, że wiosna leży u podłoża Grails, więc zastanawiałem się, czy mam dostęp do kontenera IoC Springa, tak, że mógłbym uzewnętrznić rzeczywistą zależność w pliku xml (uwaga: nigdy tak naprawdę tego nie robiłem, ale po prostu o tym wiem, więc mogę być czegoś brakuje). Moim celem jest wykonanie następujących czynności:Zastrzyk iniekcji Grails poza usługami?

class SchemaUpdateService { 
public int calculateSomething(){ 
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
IStrategy strat = (IStrategy) ctx.getBean("mystrat"); 
} 
} 

A następnie zmapuj odpowiednią implementację w pliku beans.xml. Zakładam, że jest to obsługiwane w Grails. Czy ktoś ma jakąkolwiek dokumentację, jak to działałoby? Czy naprawdę potrzebuję biblioteki Spring IoC i to będzie działać? Dzięki!

Odpowiedz

5

Definiujesz swoje ziarna w resources.xml lub resources.groovy. Grails documentation jest bardzo jasne, jak uzyskać dostęp do kontekstu aplikacji Spring.

+0

Dziękuję bardzo. Myślę, że kiedy przeczytałem to po raz pierwszy, nie wchłonąłem tego, ponieważ nie miałem jeszcze żadnego kontekstu. Doceniam to! – skaz

+0

@skaz, spójrz na FAQ na http://www.grails.org/FAQ, wyszukaj "applicationContext" w przeglądarce, ma też kilka opcji. – hvgotcodes

+0

Dzięki - Doceniam to. – skaz

4

Możesz uzyskać dostęp do kontekstu aplikacji z dowolnego artefaktu Grails przy użyciu

ApplicationContext ctx = grailsApplication.mainContext 

Następnie można użyć tego odzyskać cokolwiek fasola jesteś zainteresowany:

IStrategy strat = (IStrategy) ctx.getBean("mystrat") 

W zajęciach, które nie mieć dostęp do grailsApplication, można użyć pomocnika, takiego jak poniższy, aby uzyskać dostęp do kontekstu aplikacji i zawartych w nim ziaren:

class SpringUtils { 

    static getBean(String name) { 
     applicationContext.getBean(name) 
    } 

    static <T> T getBean(String name, Class<T> requiredType) { 
     applicationContext.getBean(name, requiredType) 
    } 

    static ApplicationContext getApplicationContext() { 
     ApplicationHolder.application.mainContext 
    } 
} 

To jednak powinno być konieczne tylko w przypadku, gdy konieczne jest pobranie różnych implementacji tego samego komponentu bean w środowisku wykonawczym. Jeśli wymagana fasola jest znany w czasie kompilacji, wystarczy podłączyć fasolę razem w resources.xml lub resources.groovy

4

Przede wszystkim chcesz zdefiniować swoją strategię w grails-app/conf/spring/resources.groovy:

beans = { 
    myStrat(com.yourcompany.StrategyImpl) { 
     someProperty = someValue 
    } 
} 

Następnie, po prostu def a nieruchomość o tej samej nazwie do Państwa dyspozycji:

class SomeGrailsService { 
    def myStrat 

    def someMethod() { 
     return myStrat.doSomething() 
    } 
} 

W każdym artefaktem Grails (takich jak usługi i klas domeny), Grails automatycznie dać myStrat Właściwość poprawna wartość. Ale nie zapominaj, że podczas testu jednostkowego będziesz musiał podać wartość ręcznie, ponieważ automatyczne okablowanie nie występuje w testach jednostkowych.

Poza artefakt Grails, można użyć coś takiego:

def myStrat = ApplicationHolder.application.mainContext.myStrat 

w Grails 2.0, Graeme wsp są deprecjację wykorzystanie *Holder zajęciach (takich jak ApplicationHolder i ConfigurationHolder), więc jestem Nie jestem do końca pewien, na czym polega gra Grails 2.0 ...

Powiązane problemy