在 spring 中使用 属性-占位符和 beanfactory

using property-placeholder with beanfactory in spring

配置如下XML

<context:property-placeholder location="constants.properties"/>

<bean id="MyDBDetails"
    class="itsmine.springcore.MyDBDetails" scope="singleton">
    <property name="fName" value="${fName}" />
    <property name="lName" value="${lName}" />
    <property name="age" value="${age}" />
</bean>

我使用以下 2 个选项在 main 中创建了一个 bean: 1) 使用 ClassPathXmlApplicationContext 2) 使用 bean 因子

动态值在使用 ClassPathXmlApplicationContext 创建 bean 时设置,但在使用 bean factory 创建时未设置。

能否请您建议如何使用 bean factory 使其工作?

提前致谢。

当对 bean 属性使用 XML 声明时,属性-placeholder 被注册为 Bean Factory Post Processor 对于 IoC 容器,因此您将拥有可用的属性值。

但是,当通过 BeanFactory 以编程方式实例化 bean 时,除非您将 `` 配置为它的 post 处理器,否则该工厂不会知道属性值:

BeanFactory factory = /* your factory initialized */;
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("constants.properties"));
cfg.postProcessBeanFactory(factory);

编辑

请注意 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#setLocation 接受 org.springframework.core.io.Resource 作为其参数,即您可以根据需要使用其任何具体子实现:

  • org.springframework.core.io.FileSystemResource: 支持文件句柄的实现。
  • org.springframework.core.io.ClassPathResource: 类路径资源的实现。
  • org.springframework.core.io.InputStreamResourceInputStream...
  • 的实现