Spring属性占位符读取的属性是否立即可用?

3
我正在修改一个应用程序上下文文件中使用的Spring PropertyPlaceholderConfigurer的代码。属性已经被成功地读取并在应用程序中使用。但是,如果我在PropertyPlaceholderConfigurer声明后面跟着一个<import resource="classpath:/my/class/path/${my.file.name}" />,就会抛出一个“无法解析占位符'my.file.name'”错误和一系列异常。在声明PropertyPlaceholderConfigurer之后,属性是否立即可用?如果不是,它们何时变为可用?
2个回答

6
导入资源会在属性占位符配置器(PropertyPlaceHolderConfigurer)解析属性占位符之前被解析。你需要将已解析的资源名称放入你的导入中。
由于PropertyPlaceHolderConfigurer是一个BeanFactoryPostProcessor,它会在Spring配置文件中的bean定义被加载后被调用一次。

3

在Spring上下文文件中进行多次传递,因此关键是属性在哪个传递中可用。不幸的是,<import>标签比bean声明(例如您的PropertyPlaceholderConfigurer)更早地处理,因此它不能以您尝试使用的方式可用。

您(可能)正在尝试做的是Spring中的常见问题,有许多各种解决方案。它们通常涉及修改构建以进行注入。在Google/Stack Overflow中搜索每个环境的Spring配置应该会找到一些东西。我已经阅读了Spring 3.1将提供一种机制来允许每个环境配置(因此如果我正在进行“测试”构建,则使用“此”属性文件,如果我正在进行“dev”构建等等),但我目前对此并不了解太多。


这个方向是正确的。然而,导入语句实际上正在读取另一个上下文文件。我的目标是根据my.file.name的值加载不同的上下文文件。每个上下文文件都有一个不同的基础缓存机制实现,这与仅需要加载不同属性文件有些不同。您对更好的方法有什么想法吗? - Adam
我过去处理这个问题的方式并不是通过属性定义导入XML文件的名称,而是导入“所有”XML文件,然后通过属性定义要注入的bean的ID。因此,您可以导入包含所有不同缓存机制的XML文件,然后由属性定义实际被注入(和使用)的缓存机制的ID。这不一定是理想的方式,但它确实能够完成工作。 - Melv
这个方法最终会实例化每个xml中的bean,无论它们是否被使用? - Adam
@Adam 默认情况下是的。你可能可以使用 lazy-init="true" 来解决这个问题,尽管我以前没有使用过。它在 Spring 文档的 3.4.4 中定义。 - Melv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接