尝试从Grails 2.3.7.
中的自定义groovy文件加载spring bean我知道之前已经问过这个问题,但经过几个小时的搜索后,我无法找到从类路径加载的一致方法。 / p>
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工作)
遵循lukelazarovic建议,这种方法有效,因为Grails会自动将src/java
中的groovy文件复制(不编译)到类路径中;在日食和战争部署中工作正常:
//bean config files here
src/java/MyBeansConfig.groovy
src/java/FooBeansConfig.groovy
//resources.groovy
loadBeans('classpath*:*BeansConfig.groovy')
此方法允许grails-app/conf/spring
中的自定义bean配置文件(ideascultor和mark.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")
}
}
}
如果您使用自定义插件,这种方法是理想的;锅炉板配置被重构到插件中:
插件配置
//## 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 App
没有配置!...只需使用*BeansConfig.groovy
约定创建您的bean配置文件,很高兴!
//bean config files here
grails-app/conf/spring/MyBeansConfig.groovy
发现选项3的一些问题:
test-app
我们设法修复了上述问题,以便在{eclipse,war,test-app等中执行Grails时grails-app/conf/spring
中的任何资源文件都一样。
第一步:我们创建了一个类,可以更好地控制资源文件的定位和加载;这是必要的,因为一些文件由于交叉引用的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
(委托)作为参数(非常重要):
def doWithSpring = {
CustomResourceLoader.loadSpringBeans(delegate)
}
就是这样,除了在grails-app/conf/spring
答案 0 :(得分:2)
几天前我遇到了类似的问题,我在grails-app/conf
添加了一个groovy配置文件。虽然这适用于其他资源(它们被复制并在类路径上可用),但是groovy文件的问题只是它被编译并且包含了类文件,即不是groovy文件本身。
我没有找到关于如何应该完成的任何好文档,最后只是将其添加到web-app/WEB-INF/classes
。放置在此处的Groovy文件将被复制(未编译)并在类路径中可用。
答案 1 :(得分:1)
Grails 2.1.2中的自定义XML文件存在同样的问题。
在grails-app/conf/spring
中使用XML资源在生产环境AFAIR中不起作用。
为了使它在开发和生产环境中都能工作,我最终将资源放入src/java
。我认为你可以通过将你的groovy文件放入src/groovy
来实现相同的结果。
答案 2 :(得分:0)
我们也可以通过以下方式从不同的groovy / xml文件导入bean: - 在resources.groovy中使用以下内容 -
importBeans'文件:camel-beans.groovy' 要么 importBeans( '类路径:/camel-config.xml')强>
将camel-beans.groovy与resources.groovy放在一起,并为第一种情况提供包作为“包弹簧”,否则将其放在web app类路径中并使用第二种方式进行。
答案 3 :(得分:0)
如果您的resources.groovy位于以下路径
grails-app/conf/spring/resources.groovy
并且你的camel-beans.groovy在以下路径
grails-app/conf/spring/camel-beans.groovy
然后你可以通过在resources.groovy中添加以下行来引用resources.groovy文件中的camel-beans.groovy
importBeans('file:**/camel-beans.groovy')