【问题标题】:Are properties read by a Spring Property Placeholder immediately available?Spring 属性占位符读取的属性是否立即可用?
【发布时间】:2011-07-12 07:58:12
【问题描述】:

我正在修改在应用程序上下文文件中使用 Spring PropertyPlaceholderConfigurer 的代码。属性被成功读取并在应用程序中使用。但是,如果我遵循带有<import resource="classpath:/my/class/path/${my.file.name}" /> 的 PropertyPlaceholderConfigurer 声明,则会引发“Could not resolve placeholder 'my.file.name'”错误和一系列异常。声明 PropertyPlaceholderConfigurer 后属性是否立即可用?如果没有,它们什么时候可用?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    在 PropertyPlaceHolderConfigurer(a BeanFactoryPostProcessor) 解析属性占位符之前解析导入资源。您必须将解析的资源名称放入您的导入中。

    由于 PropertyPlaceHolderConfigurer 是 BeanFactoryPostProcessor,一旦从 Spring 配置文件中加载了 bean 定义,就会调用它。

    【讨论】:

      【解决方案2】:

      在 spring 上下文文件上完成了多次传递,所以问题在于哪些传递是可用的属性。不幸的是,<import> 标记比 bean 声明更早地处理(例如您的 PropertyPlaceholderConfigurer 标记),因此它不会以您尝试使用它的方式可用。

      您(可能)尝试做的事情在 Spring 中很常见,有许多不同的解决方案。它们通常涉及修改您的构建以进行注入。谷歌搜索/堆栈溢出每个环境的弹簧配置应该会出现一些东西。我已经阅读过 Spring 3.1 将提供一种允许每个环境配置的工具(因此,如果我正在执行“测试”构建,则使用“this”属性文件,如果我正在执行“dev”构建,则使用这个属性文件等) ,但我目前对此了解不多。

      【讨论】:

      • 这是在正确的轨道上。但是,import 语句实际上是在另一个上下文文件中读取。我的目标是根据 my.file.name 的值加载不同的上下文文件。每个上下文文件都有不同的底层缓存机制实现,这与仅仅需要加载不同的属性文件有点不同。有什么更好的方法来做到这一点?
      • 我过去这样做的方式是不让导入xml的名称由属性定义,而是导入“所有”xml文件,然后定义属性要注入的 bean 的 id。因此,您将导入包含所有不同缓存机制的 xml,然后实际注入(和使用)的 id 由属性定义。它不一定是理想的,但它确实完成了工作。
      • 这个方法最终是否会实例化每个xml中的bean,不管它们是否被使用?
      • @Adam 默认情况下是的。您可能可以使用lazy-init="true" 来解决这个问题,尽管我以前没有使用过。它在 spring 文档的 3.4.4 中定义。
      猜你喜欢
      • 2015-05-21
      • 2014-07-16
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2012-12-27
      • 2012-08-03
      相关资源
      最近更新 更多