Property-placeholder詳解

一、property-placeholderhelp

Property-placeholder是Spring框架提供的一種用於替換XML中屬性佔位符的機制。它可以讀取Properties文件,並且在XML文件中取出相應的屬性值,並將其替換為佔位符,該機制對於模塊化配置、測試、靈活性以及重用方面都具有很大的優勢。

在Spring的應用上下文中,通過PropertyPlaceholderConfigurer可以很方便的讀取Properties文件,並用${}的語法來引用讀取的屬性值,當然在引用值為空的時候,可以設置默認值。例如:

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

在上述的代碼中,${jdbc.driverClassName}、${jdbc.url}、${jdbc.username} 和 ${jdbc.password} 都是PropertyPlaceholderConfigurer讀取Properties文件中所定義的屬性名。

二、property-placeholderhelper

除了通過PropertyPlaceholderConfigurer來讀取Properties文件之外,Spring 4.3版本以後,還提供了一個更加強大的屬性加載機制 — PropertySourcesPlaceholderConfigurer。PropertySourcesPlaceholderConfigurer繼承自PropertyPlaceholderConfigurer,並且更加靈活,支持從多個地方讀取屬性文件,包括系統屬性、Java配置類、環境變量等等。實際上,它也是Spring @PropertySources註解使用的核心類。

在Java配置類中配置示例:

@Configuration
@ComponentScan
@PropertySources(value = {
        @PropertySource("classpath:application.properties"),
        @PropertySource("file:/opt/config/application.properties")
})
public class AppConfig {

    @Autowired
    Environment env;

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.username"));
        dataSource.setPassword(env.getProperty("jdbc.password"));
        return dataSource;
    }

}

使用PropertySourcesPlaceholderConfigurer可以在Java配置類中從多個地方加載屬性,並且與其他的Spring組件無縫集成。

三、property-placeholder熱加載

在大多數情況下,我們不會在運行時更改屬性文件中的值,但是,在一些特殊的情況下,我們可能需要熱修改Properties文件的值,並且更新Spring容器中的Bean。Spring框架自身並沒有提供熱修改屬性文件的功能,但是我們可以自己實現一個熱加載的機制。

我們可以在程序中監控Properties文件的修改,並且在文件發生變更時,重新讀取Properties文件,並且更新Spring中的Bean。示例代碼如下:

@Configuration
@PropertySources(value = {@PropertySource("classpath:config.properties")})
public class AppConfig {

    @Autowired
    Environment env;

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        configurer.setLocation(new ClassPathResource("config.properties"));
        configurer.setIgnoreResourceNotFound(false);
        configurer.setIgnoreUnresolvablePlaceholders(false);
        configurer.setProperties(CommonUtils.loadProperties(configurer.getLocation()));
        return configurer;
    }

    /**
     * 監聽文件修改
     */
    @PostConstruct
    public void init() {
        String location = env.getProperty("spring.config.location");
        if (location != null) {
            File file = new File(location);
            if (!file.exists()) {
                throw new FileNotFoundException("The config file does not exist: " + file.toString());
            }
            if (location.endsWith(".properties")) {
                new PropertiesFileListener(file, this::reloadProperties).watch();
            }
        }
    }

    /**
     * 重新加載Properties文件
     * @param properties Properties
     */
    public void reloadProperties(Properties properties) {
        PropertySourcesPlaceholderConfigurer configurer = propertySourcesPlaceholderConfigurer();
        configurer.setProperties(properties);
    }

    ..........
}

四、PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer是Spring框架中的一個核心組件,它是Properties文件中的屬性值佔位符解析器。它提供了多種方式來解析Properties文件中的佔位符,例如,可以使用系統環境變量、標準JRE屬性、命令行參數、JNDI等等方式。通過PropertyPlaceholderConfigurer,我們可以輕鬆地將XML配置文件和Properties文件進行解耦合,從而實現靈活性和可維護性。例如:

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

在上述代碼中,我們將Properties文件的配置放置到了Spring的Application Context對象中,並且可以通過佔位符來引用Properties文件中的參數。

五、結合註解使用

除了XML配置之外,Property-placeholder在註解中也得到了廣泛的應用,Spring提供了@Value註解來讀取Properties文件中的配置參數,用法如下:

@Value("${jdbc.driverClassName}")
private String driverClassName;

@Value("${jdbc.url}")
private String url;

@Value("${jdbc.username}")
private String username;

@Value("${jdbc.password}")
private String password;

使用@Value註解讀取Properties文件中的配置參數,可以避免在Java代碼中硬編碼參數值,也可以讓配置從不同的環境中進行分離。

總結

Property-placeholder機制在Spring框架中得到了廣泛地應用,在不同的開發場景中起到了不可替代的作用。通過本文的介紹,我們知道,Spring提供了多種加載Properties文件的方式,從XML配置、Java配置到註解方式,我們可以根據實際的開發情況來選擇使用哪種方式。同時,在熱加載方面,我們需要根據實際需求進行調整,以達到最佳的實踐效果。

原創文章,作者:QMRW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/138678.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QMRW的頭像QMRW
上一篇 2024-10-04 00:21
下一篇 2024-10-04 00:21

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論