Grails中已知Bean名称时如何获取其所在文件名
根据Bean名称查找其所在的Groovy配置文件名
好问题!其实Spring(以及Grails基于Spring的实现)本身并没有直接提供你想要的那种getFilename()便捷方法——因为Bean实例本身不会记录它的定义来源文件信息。不过针对Groovy配置文件里定义的Bean,我们可以通过Spring的BeanDefinition元数据来间接获取到它所在的配置文件名。
实现思路
Grails的Groovy配置解析器(GroovyBeanDefinitionReader)在解析.groovy配置文件时,会将Bean定义的source属性关联到Groovy脚本的AST节点或者脚本实例本身,我们可以通过这个source来提取文件名。
具体代码实现
import org.springframework.context.ApplicationContext import grails.util.Holders def targetBeanName = 'property' ApplicationContext context = Holders.applicationContext // 获取Bean的定义元数据 def beanDefinition = context.getBeanDefinition(targetBeanName) def source = beanDefinition.source // 根据source的类型解析文件名 if (source instanceof groovy.lang.Script) { // 情况1:source是脚本实例,从类的代码源获取路径 def codeSource = source.getClass().protectionDomain.codeSource if (codeSource?.location) { def filePath = codeSource.location.path // 提取文件名 def fileName = new File(filePath).name println "Bean所在配置文件:${fileName}" // 输出 resourcesFirst.groovy } } else if (source instanceof org.codehaus.groovy.ast.ASTNode) { // 情况2:source是AST节点,从源单元获取文件名 def sourceUnit = source.sourceUnit if (sourceUnit) { println "Bean所在配置文件:${sourceUnit.name}" } }
注意事项
- 这种方法依赖于Grails内部的Groovy配置解析逻辑,不同Grails版本可能有细微差异,需要根据实际版本调整。
- 如果你的Bean是通过其他方式定义的(比如JavaConfig、XML配置、注解
@Component等),这个方法不适用,需要针对不同的source类型做额外处理。 - 当应用打包成JAR文件后,
codeSource.location会指向JAR路径,这时需要解析JAR内的条目路径来获取文件名,逻辑会更复杂一些。
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

