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

Pol*_*878 63 grails groovy grails-2.0

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

org.codehaus.groovy.grails.commons.ConfigurationHolder
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ska 104

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

    class MyController {
        def grailsApplication
    
        def myAction = {
            def bar = grailsApplication.config.my.property
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您需要在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'
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在其他任何地方,最简单的方法是将配置对象传递给需要它的类,或者传递所需的特定属性.

    // 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)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

更新:

Burt Beckwith最近写了几篇博客文章.一个讨论 getDomainClass()在域类中使用,而另一个提供创建自己的持有者类的选项(如果上述解决方案都不合适).


Jam*_*hon 57

grailsApplication的替代方法是Holders类,

import grails.util.Holders

def config = Holders.config
Run Code Online (Sandbox Code Playgroud)

你可以直接从Holders获得配置,不需要注入,这对于实用程序类等很有用.

  • 什么时候 `grails.util.Holders` 比注入 `grailsApplication` 更可取? (2认同)
  • @AlexanderSuraphel当你不想让Spring控制bean的生命周期时.例如,具有公共静态方法的实用程序类. (2认同)

小智 18

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

class BootStrap {

    def grailsApplication

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

    def destroy = {
    }
}
Run Code Online (Sandbox Code Playgroud)


Ing*_*gel 10

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

    ApplicationContext context = ServletContextHolder.servletContext.
        getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
        as ApplicationContext
    ConfigObject config = context.getBean(GrailsApplication).config
Run Code Online (Sandbox Code Playgroud)

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