65

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

org.codehaus.groovy.grails.commons.ConfigurationHolder

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

4

6 回答 6

105
  • 如果您在支持依赖注入的工件中需要它,只需注入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()在域类中使用,而另一个提供创建自己的持有者类的选项(如果上述解决方案都不合适)。

于 2011-08-21T03:14:13.547 回答
59

grailsApplication 的替代方案是Holders类,

import grails.util.Holders

def config = Holders.config

您可以直接从 Holders 中获取配置,无需注入,这对于实用程序类等非常有用。

于 2013-04-05T03:27:41.767 回答
18

您可以将“grailsApplication”注入源文件。这是一个示例 conf/Bootstrap.groovy

class BootStrap {

    def grailsApplication

    def init = { servletContext ->
        println grailsApplication.config
    }

    def destroy = {
    }
}
于 2011-08-20T22:07:00.503 回答
10

另一种不推荐使用的获取配置的方法是:

    ApplicationContext context = ServletContextHolder.servletContext.
        getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
        as ApplicationContext
    ConfigObject config = context.getBean(GrailsApplication).config

这适用于没有可用的注入父级的情况,例如 servlet 类或静态方法。

于 2012-05-22T13:14:29.203 回答
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. 在标签库中:

    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>
    
于 2014-09-02T10:32:54.103 回答
0

要从域类访问,请执行以下操作:

import grails.util.Holders

// more code

static void foo() {
  def configOption = Holders.config.myProperty
}
于 2017-08-24T23:24:02.623 回答