如何在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

  1. 在控制器中

     class DemoController { def grailsApplication def demoAction = { def obj = grailsApplication.config.propertyInConfig } } 
  2. 在服务中:

     class DemoService { def grailsApplication def demoMethod = { def obj = grailsApplication.config.propertyInConfig } } 
  3. 在taglib中:

     class DemoTaglib { def grailsApplication static namespace = "cd" def demoMethod = { def obj = grailsApplication.config.propertyInConfig out << obj } } 

你可以在视图中调用这个taglib的方法,如<cd:demoMethod/>

  1. 鉴于:

      <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 }