gpt4 book ai didi

java - 从 grails 应用程序中的自定义 groovy 文件加载 spring bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:41 25 4
gpt4 key购买 nike

尝试从 Grails 2.3.7 中的自定义 groovy 文件加载 spring bean。 我知道以前有人问过这个问题,但经过数小时的搜索,我无法找到一致的方法从类路径加载。

目标

  • resources.groovy模块化为多个自定义资源文件
  • 将自定义资源文件放在标准位置:grails-app/conf/spring
  • 使用插件来施展魔法;最小化开销

尝试过...

//## grails-app/conf/spring/MyBeansConfig.groovy 
beans {
testsvc(TestService){
msg = 'hello'
}
}

注意上面,我使用的是 beans{},而不是 beans = {}apparently这很重要:

resources.groovy

这有效...

beans = {
loadBeans 'file:C:\\Proj\Test1\grails-app\\conf\\spring\\MyBeansConfig.groovy'
}

...并根据docs ,这也应该,但不是:

importBeans("classpath:*MyBeansConfig.groovy")

更新 - 工作选项

(为 Grails 2.3.7 工作)

选项一:(src/java)

正在关注 lukelazarovic建议,这种方法有效,因为 Grails 会自动将 src/java 中的 groovy 文件复制(而不是编译)到类路径中;在 eclipse 和 war 部署中工作正常:

//bean config files here
src/java/MyBeansConfig.groovy
src/java/FooBeansConfig.groovy

//resources.groovy
loadBeans('classpath*:*BeansConfig.groovy')

选项 2: (grails-app/conf/spring)

这种方法允许在 grails-app/conf/spring 中自定义 bean 配置文件(归功于 ideascultormark.esher)

   //bean config files here
grails-app/conf/spring/MyBeansConfig.groovy

//## resources.groovy
//for eclipse/local testing
loadBeans('file:./grails-app/conf/spring/*BeansConfig.groovy')
//for WAR/classpath
loadBeans('classpath*:*BeansConfig.groovy')


//## BuildConfig.groovy
grails.war.resources = { stagingDir, args ->
copy(todir: "${stagingDir}/WEB-INF/classes/spring") {
fileset(dir:"grails-app/conf/spring") {
include(name: "*BeansConfig.groovy")
exclude(name: "resources.groovy")
exclude(name: "resources.xml")
}
}
}

选项 3:(自定义插件)

如果您使用自定义插件,这种方法是理想的;样板配置被重构到插件中:

插件配置

   //## scripts/_Events.groovy
eventCreateWarStart = { warName, stagingDir ->
def libDir = new File("${stagingDir}/WEB-INF/classes/spring")

ant.copy(todir: libDir) {
fileset(dir:"grails-app/conf/spring") {
include(name: "*BeansConfig.groovy")
exclude(name: "resources.groovy")
exclude(name: "resources.xml")
}
}
}

//## MyGrailsPlugin.groovy
def doWithSpring = {
loadBeans('file:./grails-app/conf/spring/*BeansConfig.groovy')
loadBeans('classpath*:*BeansConfig.groovy')
}

Grails 应用

无需配置!...只需使用 *BeansConfig.groovy 约定创建您的 bean 配置文件,一切顺利!

//bean config files here
grails-app/conf/spring/MyBeansConfig.groovy

2015 年 9 月 24 日更新

发现选项 3 存在一些问题:

  • 加载重复的资源文件
  • 未为 test-app 正确配置 spring 资源

我们设法解决了上述问题,使得 grails-app/conf/spring 中的任何资源文件在 eclipse、WAR、test-app 等中执行 Grails 时都能正常工作。

第一步:我们创建了一个类来更好地控制资源文件的定位和加载;这是必要的,因为某些文件由于交叉引用 bean 而被加载不止一次。我们使用一个插件来封装这个功能,所以这个类存在于那个插件中:

class CustomResourceLoader {
static loadSpringBeans(BeanBuilder bb){
def files = ['*'] //load all resource files
//match resources using multiple methods
def matchedResourceList = []
files.each {
matchedResourceList +=
getPatternResolvedResources("file:./grails-app/conf/spring/" + it + ".groovy").toList()
matchedResourceList +=
getPathMatchedResources("classpath*:spring/" + it + ".groovy").toList()
}

//eliminate duplicates resource loaded from recursive reference
def resourceMap = [:]
matchedResourceList.each{
if(it) resourceMap.put(it.getFilename(), it)
}
//make resources.groovy first in list
def resourcesFile = resourceMap.remove("resources.groovy")
if(!resourcesFile)
throw new RuntimeException("resources.groovy was not found where expected!")

def resourcesToLoad = [resourcesFile]
resourceMap.each{k,v -> resourcesToLoad << v }
log.debug("Spring resource files about to load: ")
resourcesToLoad.each{ bb.loadBeans(it) }
}

static def getPatternResolvedResources(path){
ResourcePatternResolver resourcePatternResolver =
new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources(path);
}

static def getPathMatchedResources(path){
return new PathMatchingResourcePatternResolver().getResources(path)
}
}

删除了 BeansConfig.groovy 后缀; WAR 生成现在获取 grails-app/conf/spring

中的任何资源
plugin, _Events.groovy
eventCreateWarStart = { warName, stagingDir ->
def libDir = new File("${stagingDir}/WEB-INF/classes/spring")
ant.copy(todir: libDir) {
fileset(dir:"grails-app/conf/spring") {
include(name: "*.groovy")
exclude(name: "resources.xml")
}
}
}
}

在插件定义文件中,从 doWithSpring() 调用加载器,传递 BeanBuilder(委托(delegate))作为参数(非常重要):

def doWithSpring = {       
CustomResourceLoader.loadSpringBeans(delegate)
}

就是这样,除了在 grails-app/conf/spring 中创建自定义资源文件外,对插件的用户没有任何要求

最佳答案

几天前我遇到了类似的问题,我在 grails-app/conf 中添加了一个 groovy 配置文件。虽然这适用于其他资源(它们被复制并在类路径中可用),但 groovy 文件的问题只是它被编译并且包含了类文件,即不是 groovy 文件本身。

我没有找到关于如何应该完成的任何好的文档,最后只是将它添加到 web-app/WEB-INF/classes。放置在这里的 Groovy 文件将被复制(不编译)并在类路径中可用。

关于java - 从 grails 应用程序中的自定义 groovy 文件加载 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24028410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com