Grails 2.x сервисный впрыск в Groovy / src

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

...
def myService
...

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

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

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

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

 Igor Artamonov17 мая 2012 г., 19:45
Как ты используешь этот «класс src»? Где и как вы это создаете?
 kuceram23 мая 2012 г., 10:22
Я использую его внутри других классов Groovy (он создается там). Есть класс groovy для фасада, который используется сервисом, который запускает все эти процедуры. Я не хочу передавать использованный сервис в качестве параметров, чтобы не передавать столько параметров ...

Ответы на вопрос(4)

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

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'
 boraas25 авг. 2015 г., 12:04
работает в Grails 3.0 тоже!
Решение Вопроса

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

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

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
 ubiquibacon09 авг. 2013 г., 17:23
Пока это позволит вам получить доступ к методам в службе, это нарушит транзакцию служб. Выдержка из Декларативные транзакции: Warning: внедрение зависимостей - единственный способ работы декларативных транзакций. Вы не получите транзакционную услугу, если будете использовать новый оператор, такой как new BookService ()
 Saurabh09 авг. 2013 г., 20:16
@ ubiquibacon - да, но «def emailService = ctx.emailService» будет транзакционной службой. Извините, но в чем проблема с доступом к такой службе?
 ubiquibacon09 авг. 2013 г., 20:20
Я не думаю, что это квалифицируется как «внедрение зависимости». Я должен сделать некоторое тестирование, чтобы проверить это все же.
 biniam14 июл. 2015 г., 10:00
@ ubiquibacon каков результат расследования?

е) компоненты, настроив их в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?

 mathifonseca11 апр. 2014 г., 23:14
то же самое происходит со мной, есть идеи почему?
 kuceram18 мая 2012 г., 14:12
Теперь я вижу, что это не работает для меня. Я не могу связать службу или другие свойства в resources.groovy следующим образом: `import com.path.to.ResidentAtPlace beans = {residentAtPlaceBean (ResidentAtPlace) {someProperty = 45 placeService = ref ('placeService') grailsApplication = ref ('grailsApplication') )}} `В моем ResidentAtPlace.groovy все пусто. Вы видите какие-либо проблемы? Я использую Грааль 2.0.3

Ты можешь сделать это из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) {}
}

Ваш ответ на вопрос