如何在Groovy中使用Spring DSL来根据环境(dev,qa,prod)注入依赖?

时间:2011-12-07 19:38:51

标签: spring grails groovy dependency-injection dsl

我们在Grails / Groovy中构建了一个Web应用程序。在groovy中,我们构建了一个可插入的缓存组件,以便在Grails应用程序中提供大型http响应流的缓存。我们希望在运行时基于环境注入缓存实现,例如,当开发人员正在做一些本地工作时,注入一个简单的基于Map的缓存,但是在操作环境中,注入一个RDBMS缓存数据库,你就明白了。

我们在使用SWITCH的Grails教程中找到了这个参考,它似乎有用,但它很丑陋而且很麻烦。我们有超过5种不同的环境(本地,开发,测试,uat和prod),我们需要在代码中的其他地方注入特定于环境的类,所以这种方法绝对不是理想的。还有其他选择吗?我们将不胜感激,谢谢!

//from resources.groovy
beans = {
    switch(Environment.current) {

    case Environment.PRODUCTION:
        cacheBean(com.util.OracleCacheImpl) {
           //properties here            
        }
        break

    case Environment.LOCAL:
        cacheBean(com.util.MockMapCache) { 
           //properties 
        } 
        break 
    }
}

1 个答案:

答案 0 :(得分:1)

您可以尝试使用内置的Config.groovy处理在environments {}中设置bean定义,并通过application属性分配定义。

所以在resources.groovy

beans = {
    // Create a clone of the properties definition Closure
    def cacheProps = application.config.cache.bean.props.clone()
    cacheProps.delegate = this
    cacheBean(application.config.cache.bean.class, cacheProps)
}

Config.groovy

environments {
    production {
        cache.bean.class = com.util.OracleCacheImpl
        cache.bean.props = {
            //properties as in resources.groovy
        }
    }
    'local' {
        cache.bean.class = com.util.MockMapCache
        cache.bean.props = {
            //properties as in resources.groovy
        }
    }
    'uat' {
        //etc...
    }
    //etc...
}

再考虑一下,您可以将整个bean定义放在Config.groovy Closure中,并在resources.groovy中调用它

resources.groovy

beans = {
    // Create a clone of the properties definition Closure
    def cacheBeans = application.config.cache.beans.clone()
    cacheBeans.delegate = this
    cacheBeans()
}

Config.groovy

environments {
    production {
        cache.beans = {
            cacheBean(com.util.OracleCacheImpl) {
                //properties here            
            }
        }
    }
    'local' {
        cache.beans = {
            cacheBean(com.util.MockMapCache) {
                //properties here            
            }
        }
    }
    'uat' {
        //etc...
    }
    //etc...
}