12

Groovy/srcクラスにサービスを注入したいと思います。通常の依存性注入は機能しません:

...
def myService
...

私はこれを使用することができます(それは動作します):

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

ただし、ApplicationHolderは非推奨です。より良い解決策はありますか?

提案をありがとう

4

4 に答える 4

29

ApplicationHolderの代わりにHoldersを使用できます。また、静的スコープで使用することもできます。

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'
于 2014-01-09T01:25:42.680 に答える
12

次のGrailsFAQを確認して、src / groovyのソースからアプリケーションコンテキストにアクセスします-http: //grails.org/FAQ#Q:src / groovyのソースからアプリケーションコンテキストにアクセスするにはどうすればよいですか?

ApplicationHolderに相当するApplicationContextHolderクラスはありません。src / groovyのGroovyクラスからEmailServiceというサービスクラスにアクセスするには、次のコマンドを使用してSpringBeanにアクセスします。

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
于 2012-05-18T19:17:41.713 に答える
2

次のように構成することで、新しいBeanを簡単に登録(または既存のBeanをオーバーライド)できます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 2.0でGrails構成にアクセスする方法に関するこの質問を確認できますか?

于 2012-05-18T08:38:07.903 に答える
2

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) {}
}
于 2015-05-20T07:25:41.880 に答える