PropertyPlaceholderConfigurer 的使用

299 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

之前的文章我们提过,Spring 提供了几种默认的BeanFactoryPostProcessor 来供我们使用。

我们首先来看PropertyPlaceholderConfigurer 的使用方法。

PropertyPlaceholderConfigurer

在我们开发过程中,一定不可避免地需要一些管理系统的信息和业务对象相关的配置信息,如果把它们都放到XML 配置文件中,那么在业务迭代的过程中,在频繁修改xml 文件的时候,肯定会有把配置信息“改错”的风险。

为了避免这个问题,我们选择把一些“系统级”的数据(如数据库连接信息,邮件服务信息,云服务信息等等)单独配置到一个properties 文件中。这样在系统资源发生变动的时候,我们仅需要关注property 文件就好了。

PropertyPlaceholderConfigurer 允许开发者在XML 文件中使用“占位符”,然后将这些占位符代表的对应的资源单独放到properties 文件中配置,进而加载到系统中。就拿上面的ApplicationContext 的场景举例,通过这种方式进配置,就不需要把db 连接池,邮件链接内容配置到xml 文件中了。

首先我们看xml 文件中的“占位符”如何使用,代码如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close>
    <property name="url">
        <value>${jdbc.url}</value>
    </property>
    <property name="driverClassName">
        <value>${jdbc.driver}</value>
    </property>
    <property name="username">
        <value>${jdbc.username}</value>
    </property>
    <property name="password">
        <value>${jdbc.password}</value>
    </property>
    ...
</bean>

上面那些xml 中占位符代表的资源信息,都放到了jdbc.properties 文件中,代码如图所示:

jdbc.url=jdbc:mysql://xxxxxxxxxxxxxxx
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=xiaoming
jdbc.password=pwd

而这个流程运作的机制正如前文所述,加载机制分为两个阶段。

第一阶段是容器的启动,需要加载所有的配置信息,但是BeanFactory 中所保存的对象的属性信息却还是以占位符的形式存在的。当PropertyPlaceholderConfigurer 作为BeanFactoryPostProcessor 被应用的时候,它就会使用properties 文件中的配置的信息去替换相应的加载完成的BeanDefinition 中的占位符所表示的属性值。

然后到了第二个阶段:bean 的实例化阶段,bean 中定义的那些属性就会被替换成真正的配置中希望的内容了。

总结

对于PropertyPlaceholderConfigurer 来说,它不仅仅会检查并加载properties 文件中的配置项,还会去看Java 中System 类中的Properties。我们可以通过相应的方法进行控制,系统默认采用的策略是,如果Properties 文件中找不到对应的配置内容,那么就会到System 的Properties 中查找。如果读者有兴趣可以直接到Javadoc 中去寻找对应的内容。