PropertyPlaceholderConfigurer用法

本文介绍如何使用Spring框架中的PropertyPlaceholderConfigurer类实现属性文件的加载与解析,从而灵活地管理应用程序配置。通过实例展示了如何将配置信息从XML中分离到.properties文件中,方便维护与定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring的框架中为您提供了一个 BeanFactoryPostProcessor 的实作类别: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。藉由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以让XML定义档负责系统相关设定,而.properties档可以作为客户根据需求,自定义一些相关的参数。

来看一个Bean定义档的实际例子:

  • beans-config.xml
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>  
    <bean id="configBean" 
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="location">
<value>hello.properties</value>
</property>
</bean> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="helloWord"> <value>${onlyfun.caterpillar.helloWord}</value> </property> </bean> </beans>


假设在helloBean中有许多依赖注入的属性,这些都是比较不常变动的属性,而其中helloWord会经常变动,可以透过hello.properties来简单的设定,而这个资讯已设定在configBean的location属性中:

  • hello.properties
onlyfun.caterpillar.helloWord=Welcome!


在helloBean的helloWord属性中,${onlyfun.caterpillar.helloWord}将会被hello.properties的helloWord所取代。

如果有多个.properties档案,则可以透过locations属性来设定,例如:

  • beans-config.xml

 

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans>  
    <bean id="configBean" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="locations"> <list>
<value>hello.properties</value> <value>welcome.properties</value> <value>other.properties</value>
</list> </property>
</bean> <bean id="helloBean" class="onlyfun.caterpillar.HelloBean"> <property name="helloWord"> <value>${onlyfun.caterpillar.helloWord}</value> </property> ... </bean> </beans>
Spring Boot中,可以通过自定义一个PropertySource来实现自定义的PropertyPlaceholderConfigurer。 首先,创建一个类,继承自PropertySource,实现getProperties方法,该方法返回一个Properties对象,其中包含了我们要替换的属性值,例如: ```java public class MyPropertySource extends PropertySource { public MyPropertySource(String name) { super(name); } @Override public Object getProperty(String name) { // 返回我们要替换的属性值 if (name.equals("my.property")) { return "my custom property value"; } return null; } @Override public boolean containsProperty(String name) { // 判断是否包含我们要替换的属性 return name.equals("my.property"); } @Override public Enumeration<?> getPropertyNames() { // 返回所有属性名 return Collections.enumeration(Arrays.asList("my.property")); } @Override public String toString() { return "MyPropertySource"; } } ``` 然后,在Spring Boot启动类中,将该自定义的PropertySource添加到Environment中: ```java @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication app = new SpringApplication(MyApp.class); app.setAdditionalProfiles("my-profile"); app.setEnvironment(new StandardEnvironment() { @Override protected void customizePropertySources(MutablePropertySources propertySources) { super.customizePropertySources(propertySources); propertySources.addFirst(new MyPropertySource("my-property-source")); } }); app.run(args); } } ``` 在上述代码中,我们通过setEnvironment方法设置了一个新的Environment,并在customizePropertySources方法中,将自定义的PropertySource添加到了最前面,以确保优先使用该自定义的PropertySource替换属性值。 最后,在application.yml或application.properties中,可以使用${my.property}来引用我们自定义的属性值,例如: ```yaml my.custom.property: ${my.property} ``` 这样,当应用启动时,就会将${my.property}替换成我们自定义的属性值"my custom property value"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值