Spring 框架類PropertySourcesPlaceholderConfigurer

文采杰出發表於2024-05-25

PropertyOverrideConfigurer 是 Spring 框架中的一個類,它允許你在 Spring 的配置檔案之外透過外部屬性檔案來覆蓋已定義的 bean 屬性。這在部署不同的環境(如開發、測試、生產)時特別有用,因為你可以為不同的環境定義不同的屬性,而無需修改 Spring 的配置檔案。
演示:

  • 建立實體類:
package com.powernode.spring6.bean;
import javax.sql.DataSource;

public class MyDataSource  {
    private String driver;
    private String url;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

/*    public String getDriver() {
        return driver;
    }

    public String getUrl() {
        return url;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }*/
}
  • 在resources目錄下建立外部配置檔案dao.properties
dataSource.driver=com.mysql.cj.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/mydb_dev
dataSource.username=root
dataSource.password=123

此處dao.properties中的內容必須以<bean id="dataSource"為字首;id值如果變了,此處的字首也得跟著變.

  • 編輯spring配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--透過location引入外部配置檔案-->
    <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
        <property name="location" value="classpath:dao.properties"/>
    </bean>
    <bean id="dataSource" class="com.powernode.spring6.bean.MyDataSource">
        <property name="username" value="haha"/>
        <property name="driver" value="baidu.com"/>
        <property name="url" value="qq.com"/>
        <property name="password" value="456"/>
    </bean>
</beans>
  • 測試
    @Test
    public void TestProperties(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.properties.xml");
        MyDataSource myDataSource = classPathXmlApplicationContext.getBean("dataSource", MyDataSource.class);
        System.out.println(myDataSource);
    }

輸出結果為:MyDataSource{driver='com.mysql.cj.jdbc.Driver', url='jdbc:mysql://localhost:3306/mydb_dev', username='root', password='123'}
也就是覆蓋了spring配置檔案中原來的配置.

  • 總結:
  1. PropertyOverrideConfigurer主要用於覆蓋已定義的bean屬性。當你在Spring配置檔案中定義了一個bean的屬性,但希望在執行時透過外部屬性檔案來動態覆蓋這些屬性的值時,你可以使用PropertyOverrideConfigurer。它允許你透過外部屬性檔案來靈活地修改bean的屬性,而無需修改Spring配置檔案本身。
  2. PropertySourcesPlaceholderConfigurer則主要用於處理佔位符。在Spring配置檔案中,你可能會使用一些佔位符(如${property.name})來表示一些屬性值,而這些佔位符的具體值希望在執行時從外部屬性檔案或其他來源中獲取。PropertySourcesPlaceholderConfigurer的作用就是解析這些佔位符,將它們替換為實際的屬性值。

相關文章