如果你不想看propertyPlaceholderConfigurer使用的原理,你可以点击这里 ,直接跳转到你所需要的property-placeholder。
Spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制。该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。这就相当于在容器实现的第一阶段最后加入一道工序,让我们对最终的BeanDefinition做一些额外的操作,比如修改其中bean定义的某些属性,为bean定义增加其他信息等.
- 如果要定义实现BeanFactoryPostProcessor,通常我们需要实现org.springframework.beans.factory.config.BeanFactoryPostProcessor接口。同时,因为一个容器可能拥有多个Bean-FactoryPostPrecessor,这个时候可能需要实现类同时实现Spring的org.springframework.core.Ordered接口,以保证各个BeanFactoryPostProcessor可以按照预先设定的顺序执行(如果顺序要紧的话)。但是,因为Spring已经提供了几个现成的BeanFactoryPostProcessor实现类,所以,大多数时候,我们很少自己实现某个BeanFactoryPostProcessor。其中org.springframework,beans.config.PropertyPlaceholderConfigurer和org.springframework.beans.factory.config.PropertyOverrideConfiger是两个比较常用的BeanFactoryPostProcessor。另外,为了处理配置文件中的数据类型与真正的业务对象所定义的数据类型的转换,Spring还允许我们通过org.springframework.beans.factory.config.CustomEditorConfigurer来注册自定义的PropertyEditor以补助容器中默认的PropertyEditor。可以参考BeanFactoryPostProcessor的javadoc来了解更多其实现子类的情况。
(propertyPlaceholderConfigurer)propertyPlaceholder的使用场景
通常情况下,我们不想将类似于系统管理相关的信息同业务对象相关的配置信息混杂到XML配置文件中,以免部署或者维护期间因为改动频繁的XML配置文件而出现的问题。我们会将一些数据库连接信息、邮件服务器等相关信息单独配置在一个properties文件中,这样,如果因系统资源变动的话,只需要关注这些简单properties配置文件即可。
PropertyPlaceholderConfigurer允许我们在XML配置文件中使用占位符(PlaceHolder),并将这些占位符所代表的资源单独配置到简单的properties文件中来加载。 以数据源的配置为例,使用了PropertyPlaceholderConfigurer之后,可以在XML配置文件中按照下图的方式配置数据源,而不用将连接地址。用户名、和密码等都配置到XML中。
示例:
jdbc.properties文件
PropertyPlaceholderConfigurer不单会从其配置的properties文件中加载配置项,同时还会检查Java的System类中的Properties,可以通过setSystemPropertiesMode()或者setSystemPropertiesModeName()来控制是否加载或者覆盖System相应的Properties的行为。PropertyPlaceholderConfigurer提供了SYSTEM_PROPERTIES_MODE_FALLBACK、SYSTEM_PROPERTIES_MODE_NEVER和SYSTEM_PROPERTIES_MODE_OVERRIDE三种模式,默认采用的是SYSTEM_PROPERTIES_MODE_FALLBACK,即如果properties文件中找不到相应配置项,则到System的Properties中查找,我们还可以选择不检查System的Properties或者覆盖它。更多信息请参考PropertyPlaceholderConfigurer的Javadoc文档。