【问题标题】:How to access Grails configuration in Grails 2.0?如何在 Grails 2.0 中访问 Grails 配置?
【发布时间】:2011-10-31 07:21:06
【问题描述】:

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

org.codehaus.groovy.grails.commons.ConfigurationHolder

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

【问题讨论】:

    标签: grails groovy grails-2.0


    【解决方案1】:
    • 如果你需要它在一个支持依赖注入的工件中,只需注入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 选项(如果上述解决方案都不合适)。

    【讨论】:

    • Rob,非常有帮助的答案。谢谢。
    【解决方案2】:

    grailsApplication 的替代品是Holders 类,

    import grails.util.Holders
    
    def config = Holders.config
    

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

    【讨论】:

    • 这可能是最直接的方式,因为直接 1:1 映射到已弃用的类。
    • 什么时候grails.util.Holders比注入grailsApplication更好?
    • @AlexanderSuraphel 当您不想让 Spring 控制 bean 的生命周期时。例如,具有公共静态方法的实用程序类。
    • 我们如何在外部javascript文件中使用它?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以访问 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的这个方法为&lt;cd:demoMethod/&gt;

        1. 在视图中:

           <html>
               <head><title>Demo</title></head>
           <body>
               ${grailsApplication.config.propertyInConfig}
           </body>
          
           </html>
          

        【讨论】:

          【解决方案6】:

          要从域类访问:

          import grails.util.Holders
          
          // more code
          
          static void foo() {
            def configOption = Holders.config.myProperty
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            • 2023-03-16
            • 2011-01-08
            • 1970-01-01
            • 2011-12-26
            • 1970-01-01
            • 2012-01-01
            相关资源
            最近更新 更多