Запуск услуги Grails 2.x в Groovy/src
Я хотел бы добавить свою службу в класс Groovy/src. Нормальная инъекция зависимостей не работает:
...
def myService
...
Я могу использовать это (он работает):
def appCtx = ApplicationHolder.application.getMainContext()
def myService = appCtx.getBean("myService");
но ApplicationHolder устарел. Есть ли лучшее решение?
Спасибо за любое предложение
Ответы
Ответ 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) {}
}