spring - 如何在 Groovy 中使用 Spring DSL 基于环境(dev、qa、prod)注入(inject)依赖?

标签 spring grails groovy dependency-injection dsl

我们在 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/

相关文章:

java - 为什么WEB-INF文件夹内的jsp文件可以工作,而放在WEB-INF下的文件夹下却不能呢?

spring - Spring MVC 如何处理 Controller 中引发的未捕获异常?

java - 在war文件中的WEB-INF之外创建配置属性文件

Jenkins docker 管道错误

java - Groovy Expando 可序列化

jenkins - 如何在 Jenkins 控制台输出上写?

Spring web 项目在 Eclipse 中与 Tomcat 一起运行正常,但在独立的 ApacheTomcat 服务器上运行时给出 404

spring - Tomcat 无法启动应用程序

data-binding - 数据绑定(bind)到 Grails 中命令上的枚举

grails - Grails/GORM —使用 'hasMany'将关联映射到整个类层次结构