如何在Grails 2.0中访问Grails配置?

时间:2011-08-20 17:55:38

标签: grails groovy grails-2.0

我已获得最新的Grails 2.0里程碑,我看到ConfigurationHolder类的弃用警告:

org.codehaus.groovy.grails.commons.ConfigurationHolder

弃用消息只是简单地说“使用依赖注入”,这对我没有多大帮助。我理解依赖注入,但是如何使用正确的Grails配置连接bean,以便我可以在运行时访问它?我需要从我的控制器和标签以外的位置访问配置(例如BootStrap)。

6 个答案:

答案 0 :(得分:104)

  • 如果您在支持依赖注入的工件中需要它,只需注入grailsApplication

    class MyController {
        def grailsApplication
    
        def myAction = {
            def bar = grailsApplication.config.my.property
        }
    }
    
  • 如果您需要使用src/groovysrc/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配置

  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    
        }
    }
    
  4. 您可以在视图中将此taglib方法称为<cd:demoMethod/>

    1. 在视图中:

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