最新のGrails 2.0マイルストーンを取得しましたが、ConfigurationHolder
クラスの非推奨警告が表示されています。
org.codehaus.groovy.grails.commons.ConfigurationHolder
非推奨のメッセージには、「依存関係の注入を代わりに使用する」というメッセージが表示されるだけで、あまり役に立ちません。依存性注入は理解できますが、実行時にアクセスできるように適切なGrails構成でBeanを接続するにはどうすればよいですか?コントローラーとタグ以外の場所(BootStrap
など)から構成にアクセスする必要があります。
依存性注入をサポートするアーティファクトで必要な場合は、単にgrailsApplication
を注入します
_class MyController {
def grailsApplication
def myAction = {
def bar = grailsApplication.config.my.property
}
}
_
たとえば、_src/groovy
_または_src/Java
_のBeanで必要な場合は、_conf/spring/resources.groovy
_を使用して接続します。
_// src/groovy/com/example/MyBean.groovy
class MyBean {
def grailsApplication
def foo() {
def bar = grailsApplication.config.my.property
}
}
// resources.groovy
beans = {
myBean(com.example.MyBean) {
grailsApplication = ref('grailsApplication')
// or use 'autowire'
}
}
_
他の場所では、おそらくそれを必要とするクラスに構成オブジェクトを渡すか、必要な特定のプロパティを渡すのが最も簡単でしょう。
_// src/groovy/com/example/NotABean.groovy
class NotABean {
def foo(def bar) {
...
}
}
// called from a DI-supporting artifact
class MyController {
def grailsApplication
def myAction = {
def f = new NotABean()
f.foo(grailsApplication.config.my.property)
}
}
_
更新:
Burt Beckwith は最近、これに関するブログ記事をいくつか書いています。 1つはドメインクラス内からのgetDomainClass()
の使用について説明し、もう1つは 独自のホルダークラスの作成オプションを提供します (上記のソリューションがどれも適切でない場合)。
GrailsApplicationの代わりに Holders クラスがあります。
import grails.util.Holders
def config = Holders.config
ホルダーから直接設定を取得し、インジェクションは不要です。これはユーティリティクラスなどに適しています。
「grailsApplication」をソースファイルに挿入できます。サンプルconf/Bootstrap.groovyはこちら
class BootStrap {
def grailsApplication
def init = { servletContext ->
println grailsApplication.config
}
def destroy = {
}
}
構成を取得するもう1つの非推奨の方法は次のとおりです。
ApplicationContext context = ServletContextHolder.servletContext.
getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
これは、サーブレットクラスや静的メソッドなど、使用可能な挿入された親がない状況で機能します。
Grails構成にアクセスできます
コントローラー内
class DemoController {
def grailsApplication
def demoAction = {
def obj = grailsApplication.config.propertyInConfig
}
}
サービス内:
class DemoService {
def grailsApplication
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
}
}
Taglibで:
class DemoTaglib {
def grailsApplication
static namespace = "cd"
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
out << obj
}
}
<cd:demoMethod/>
としてビューでtaglibのこのメソッドを呼び出すことができます
ビューで :
<html>
<head><title>Demo</title></head>
<body>
${grailsApplication.config.propertyInConfig}
</body>
</html>
ドメインクラスからアクセスするには:
import grails.util.Holders
// more code
static void foo() {
def configOption = Holders.config.myProperty
}