Инъекция зависимостей Grails вне услуг? - PullRequest
7 голосов
/ 08 сентября 2011

У меня есть приложение Grails, которому нужно запустить стратегию, которая, вероятно, будет заменена со временем. Я знаю, что Spring лежит в основе Grails, поэтому мне было интересно, если бы у меня был доступ к контейнеру Spring IoC, чтобы я мог экстернализовать фактическую зависимость в XML-файле (примечание: на самом деле я никогда не делал этого, но просто знаю об этом, так что я могу чего-то не хватает). Моя цель - сделать что-то вроде следующего:

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

И затем сопоставьте соответствующую реализацию в файле beans.xml. Я предполагаю, что это поддерживается в Grails. У кого-нибудь есть документация о том, как это будет работать? Мне действительно нужна библиотека Spring IoC, и она будет работать? Спасибо!

Ответы [ 3 ]

5 голосов
/ 08 сентября 2011

Вы определяете свои бобы в resources.xml или resources.groovy. Документация Grails очень ясно показывает, как получить доступ к контексту приложения Spring.

4 голосов
/ 09 сентября 2011

Прежде всего, вы хотите определить свою стратегию в вашем grails-app/conf/spring/resources.groovy:

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

Затем вы просто def свойство с тем же именем в вашей службе:

class SomeGrailsService {
    def myStrat

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

В любом артефакте Grails (например, в службах и классах доменов) Grails автоматически присваивает свойству myStrat правильное значение.Но не забывайте, что в модульном тесте вам нужно будет указать его значение вручную, поскольку автоматическое подключение не происходит в модульных тестах.

За пределами артефакта Grails вы можете использовать что-то вроде:

def myStrat = ApplicationHolder.application.mainContext.myStrat

В Grails 2.0 Грэм и др. Не одобряют использование классов *Holder (таких как ApplicationHolder и ConfigurationHolder), поэтому я не совсем уверен, что подход Grails 2.0будет ...

4 голосов
/ 08 сентября 2011

Вы можете получить доступ к контексту приложения из любого артефакта Grails, используя

ApplicationContext ctx = grailsApplication.mainContext

Затем вы можете использовать его для получения любых интересующих вас бинов:

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

В классах, которыеу вас нет доступа к grailsApplication, вы можете использовать помощника, такого как следующий, чтобы получить доступ к контексту приложения и его компонентам

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

Однако это должно быть необходимо, только если вам нужно получить разныереализации одного и того же компонента во время выполнения.Если требуемый компонент известен во время компиляции, просто соедините компоненты вместе в resources.xml или resources.groovy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...