我们在 Grails/Groovy 中构建了一个 Web 应用程序。在 groovy 中,我们构建了一个可插入的缓存组件,以在 Grails 应用程序中提供大型 http 响应流的缓存。我们希望在运行时基于环境注入(inject)缓存实现,例如,当开发人员在做一些本地工作时,注入(inject)一个简单的基于 Map 的缓存,但在操作环境中,注入(inject)一个 RDBMS 缓存数据库,你明白了。
我们在使用 SWITCH 的 Grails 教程中找到了这个引用,它似乎可以工作,但它又丑又麻烦。我们有超过 5 种不同的环境(local、dev、test、uat 和 prod),我们需要在代码的其他地方注入(inject)特定于环境的类,所以这种方法绝对不理想。有没有其他选择?示例将不胜感激,谢谢!
//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
}
}
最佳答案
您可以尝试在 Config.groovy
中设置您的 bean 定义。 ,使用其内置的environments {}
通过 application
处理和分配定义属性(property)。
所以在 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...
}
关于spring - 如何在 Groovy 中使用 Spring DSL 基于环境(dev、qa、prod)注入(inject)依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8421432/