Spring容器扩展--PropertyPlaceholderConfigurer



 要了解这个类首先要弄清楚一个概念:bean factory post-processor
官方解释是这样的:
A bean factory post-processor is a java class which implements the
org.springframework.beans.factory.config.BeanFactoryPostProcessor interface. It is executed manually  (in the case of the BeanFactory) or automatically (in the case of the ApplicationContext) to apply changes of some sort to an entire BeanFactory, after it has been constructed.

1.首先bean factory post-processor实现了org.springframework.beans.factory.config.BeanFactoryPostProcessor接口。
2.在BeanFactory的情况下它被手动的执行。
3.在ApplicationContext的条件下它会自动的执行。
4.最关键的一点是,是在一个类的实例被构造出来之后,对整个BeanFactory进行修改。

 

PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。关于BeanFactoryPostProcessor和BeanPostProcessor类似。

PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。这样的话,我只需要对properties文件进行修改,而不用对xml配置文件进行修改。

作用是什么呢?

有一些属性值不需要经常变更,但是有一些属性值可能随时改变,把经常会改动的属性值放在另一个文件中的话,程序使用起来也更方便。

下面将通过一个例子来理解PropertyPlaceholderConfigurer。
首先是配置文件,代码如下:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="propertyPlaceHolder.properties"/>
    </bean>
    <bean id ="student" class="co.jp.beanFactoryPost.Student">
     <property name="name">
      <value>${name}</value>
     </property>
     <property name="age">
      <value>${age}</value>
     </property>
     <property name="birth">
      <value>${birth}</value>
     </property>
    </bean>
</beans> 



在这个配置文件中最重要的就是下面这段代码,

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="propertyPlaceHolder.properties"/>
</bean>

PropertyPlaceholderConfigurer会读取location所设定的属性文件,并将properties文件中的值,设定给${name},${age},${birth}从而完成依赖注入。

相应的properties文件的定义如下:

name=xiaohailin
age=27
birth=19820123

这里用到的student bean,的class的代码如下:

比较简单,主要是一个get,set方法

package co.jp.beanFactoryPost;

public class Student {
    private String name;
    private String age;
    private String birth;
    public void setName(String name)
    {
        this.name = name;
    }
    public void setAge(String age)
    {
        this.age = age;
    }
    public void setBirth(String birth)
    {
        this.birth = birth;
    }
    public String getName()
    {
        return this.name;
    }
    public String getAge()
    {
        return this.age;
    }
    public String getBirth()
    {
        return this.birth;
    }
}

接着,写一个测试的主类,代码如下:

public class PropertyHolderPlaceDemo {

  
    public static void main(String[] args) {
      
        ApplicationContext ctx = new ClassPathXmlApplicationContext("propertyPlaceHolder.xml");
      
        Student student = (Student) ctx.getBean("student");
        System.out.println(student.getAge());
        System.out.println(student.getBirth());
        System.out.println(student.getName()); 
    }
}
 
配置参数参考:
 
通常使用PropertyPlaceholderConfigurer 定位一个properties文件读取一些配置变量的值来配置其他的beans。
如果properties放在classpath下,可以通过这样访问:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <value>classpath*:jdbc.properties</value>  
            </list>  
        </property>  
</bean> 

如果是一个文件,value可以是file:c:/jdbc.properties

还有其他的参考spring参考手册4.4节


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值