如何在Grails 2.0中访问Grailsconfiguration?
我已经获得了最新的Grails 2.0里程碑,并且我看到了ConfigurationHolder
类的弃用警告:
org.codehaus.groovy.grails.commons.ConfigurationHolder
弃用消息简单地说“使用dependency injection,而不是对我很有帮助”。 我了解dependency injection,但我怎样才能连接适当的Grailsconfiguration的bean,以便我可以在运行时访问它? 我需要从我的控制器和标签(比如BootStrap
)以外的地方访问configuration。
-
如果您在支持dependency injection的工件中需要它,只需注入
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' } }
-
其他任何地方,最简单的方法是将configuration对象传递给需要它的类,或者传递所需的特定属性。
// 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()
,另一个提供创build自己的持有者类的选项(如果上述解决scheme都不合适)。
GrailsApplication的替代方法是Holders类,
import grails.util.Holders def config = Holders.config
你可以直接从持有者那里获得configuration,不需要注入任何东西,这对于实用程序类是很好的。
你可以注入“grailsApplication”到你的源文件中。 这里是一个示例conf / Bootstrap.groovy
class BootStrap { def grailsApplication def init = { servletContext -> println grailsApplication.config } def destroy = { } }
另一个非弃用的方式来获得configuration是:
ApplicationContext context = ServletContextHolder.servletContext. getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) as ApplicationContext ConfigObject config = context.getBean(GrailsApplication).config
这适用于没有可用注入父项的情况,如servlet类或静态方法。
您可以访问grailsconfiguration
-
在控制器中
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>
从域类访问做:
import grails.util.Holders // more code static void foo() { def configOption = Holders.config.myProperty }