我已经获得了最新的 Grails 2.0 里程碑,并且看到了ConfigurationHolder
该类的弃用警告:
org.codehaus.groovy.grails.commons.ConfigurationHolder
弃用消息只是说“改用依赖注入”,这对我没有多大帮助。我了解依赖注入,但是如何使用正确的 Grails 配置连接 bean,以便在运行时访问它?我需要从我的控制器和标签以外的地方访问配置(例如BootStrap
)。
我已经获得了最新的 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
}
}
如果你需要它在一个 bean 中,比如说,src/groovy
或者src/java
,使用它来连接它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最近为此写了几篇博客文章。一个讨论 getDomainClass()
在域类中使用,而另一个提供创建自己的持有者类的选项(如果上述解决方案都不合适)。
grailsApplication 的替代方案是Holders类,
import grails.util.Holders
def config = Holders.config
您可以直接从 Holders 中获取配置,无需注入,这对于实用程序类等非常有用。
您可以将“grailsApplication”注入源文件。这是一个示例 conf/Bootstrap.groovy
class BootStrap {
def grailsApplication
def init = { servletContext ->
println grailsApplication.config
}
def destroy = {
}
}
另一种不推荐使用的获取配置的方法是:
ApplicationContext context = ServletContextHolder.servletContext.
getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
这适用于没有可用的注入父级的情况,例如 servlet 类或静态方法。
您可以访问 grails 配置
在控制器中
class DemoController {
def grailsApplication
def demoAction = {
def obj = grailsApplication.config.propertyInConfig
}
}
在服务中:
class DemoService {
def grailsApplication
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
}
}
在标签库中:
class DemoTaglib {
def grailsApplication
static namespace = "cd"
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
out << obj
}
}
您可以在视图中调用 taglib 的此方法 <cd:demoMethod/>
鉴于:
<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
}