我已获得最新的Grails 2.0里程碑,我看到ConfigurationHolder
类的弃用警告:
org.codehaus.groovy.grails.commons.ConfigurationHolder
弃用消息只是简单地说“使用依赖注入”,这对我没有多大帮助。我理解依赖注入,但是如何使用正确的Grails配置连接bean,以便我可以在运行时访问它?我需要从我的控制器和标签以外的位置访问配置(例如BootStrap
)。
答案 0 :(得分:104)
如果您在支持依赖注入的工件中需要它,只需注入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最近写了几篇博文。来自域类中的One discusses using getDomainClass()
,而另一个提供creating your own holder class的选项(如果以上解决方案都不合适)。
答案 1 :(得分:57)
grailsApplication的替代方法是Holders类,
import grails.util.Holders
def config = Holders.config
你直接从Holders获得配置,不需要注入,这对于实用程序类等很好。
答案 2 :(得分:18)
您可以将“grailsApplication”注入源文件。这是一个示例conf / Bootstrap.groovy
class BootStrap {
def grailsApplication
def init = { servletContext ->
println grailsApplication.config
}
def destroy = {
}
}
答案 3 :(得分:10)
获取配置的另一种不推荐的方法是:
ApplicationContext context = ServletContextHolder.servletContext.
getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
这适用于没有注入父项的情况,例如servlet类或静态方法。
答案 4 :(得分:4)
您可以访问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
}
}
您可以在视图中将此taglib方法称为<cd:demoMethod/>
在视图中:
<html>
<head><title>Demo</title></head>
<body>
${grailsApplication.config.propertyInConfig}
</body>
</html>
答案 5 :(得分:0)
从域类访问:
import grails.util.Holders
// more code
static void foo() {
def configOption = Holders.config.myProperty
}