Подтвердить что ты не робот

Запуск услуги Grails 2.x в Groovy/src

Я хотел бы добавить свою службу в класс Groovy/src. Нормальная инъекция зависимостей не работает:

...
def myService
...

Я могу использовать это (он работает):

def appCtx = ApplicationHolder.application.getMainContext()
def myService = appCtx.getBean("myService");

но ApplicationHolder устарел. Есть ли лучшее решение?

Спасибо за любое предложение

4b9b3361

Ответ 1

Ознакомьтесь с Чародом Grails, чтобы получить доступ к контексту приложения из источников в src/ groovy - http://grails.org/FAQ#Q: Как получить доступ к контексту приложения из источников в src/ groovy?

Нет класса ApplicationContextHolder, эквивалентного ApplicationHolder. Чтобы получить доступ к классу службы, называемому EmailService, из класса Groovy в src/groovy, обратитесь к Spring bean, используя:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
def emailService = ctx.emailService

Ответ 2

Замена ApplicationHolder может быть Holders, вы также можете использовать его в статической области:

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'

Ответ 3

Вы можете легко зарегистрировать новый (или переопределить существующий) beans, настроив их в grails-app/conf/spring/resources.groovy:

// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

Также вы можете проверить этот вопрос о Как получить доступ к конфигурации Grails в Grails 2.0?

Ответ 4

Yo может сделать это с помощью resources.groovy:

// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

или просто используя автообновленную анотацию:

// src/groovy/com/example/MyClass.groovy

import org.springframework.beans.factory.annotation.Autowired

class MyClass {
    @Autowired 
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {}
}