知識庫 / Spring RSS 訂閱

Spring 項目配置

Spring
HongKong
10
03:02 PM · Dec 06 ,2025

目錄

1. 配置必須具有環境特定性

配置必須具有環境特定性——這只是一個事實。如果不是這樣,那就不再是配置,我們只是會在代碼中硬編碼值。

對於 Spring 應用,您可以選擇多種解決方案——從簡單方案到高度靈活、極其複雜的替代方案。

其中一種更常見且直接的解決方案是靈活地使用 屬性文件,以及 Spring 提供的第一類屬性支持。

作為概念驗證,為了本文的目的,我們將研究一種特定的屬性類型——數據庫配置。使用不同的數據庫配置對於生產環境、測試環境和開發環境來説,這完全有道理。

2. 環境下的 .properties 文件

讓我們開始我們的概念驗證 – 通過定義我們想要針對的環境:

    • Dev
    • Staging
    • Production

720

接下來 – 創建 3 個 properties 文件,每個文件對應一個環境:

  1. persistence-dev.properties
  2. persistence-staging.properties
  3. persistence-production.properties

在典型的 Maven 應用中,這些文件可以位於 src/main/resources,但無論它們位於何處,在部署應用程序時,它們需要 在類路徑上可用

一個重要的補充説明是 – 將所有 properties 文件納入版本控制可以使配置更加透明和可重複。這與將配置放在磁盤上的某個位置,然後簡單地將 Spring 指向它們不同。

3. Spring 配置

在 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"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.0.xsd">

      <context:property-placeholder
         location="
         classpath*:*persistence-${envTarget}.properties" />

</beans>

當然,同樣可以這樣使用Java配置:

@PropertySource({ "classpath:persistence-${envTarget:dev}.properties" })

這種方法允許擁有多個 .properties 文件,以實現特定、專注的目的。例如——在我們這裏,持久化 Spring 配置導入持久化屬性,這完全合理。安全配置將導入與安全相關的屬性,以此類推。

4. 在每個環境設置屬性

最終的可部署WAR包將包含所有屬性文件 – 用於持久化,包括三種persistence-*.properties變體。由於這些文件名稱不同,因此不存在意外包含錯誤文件的風險。我們將設置envTarget變量,從而從多個現有變體中選擇所需的實例。

變量envTarget可以在操作系統/環境中設置,也可以作為JVM命令行參數設置:

-DenvTarget=dev

5. 測試與 Maven

對於需要啓用持久性的集成測試,我們只需在 pom.xml 中設置 envTarget 屬性:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
      <systemPropertyVariables>
         <envTarget>h2_test</envTarget>
      </systemPropertyVariables>
   </configuration>
</plugin>

相應的 persistence-h2_test.properties 文件應放置在 src/test/resources 中,以便僅在測試期間使用,避免在運行時與 WAR 包一起不必要地包含和部署。

6. 進一步擴展

如果需要,可以採用多種方式增加此解決方案的靈活性。

一種方法是使用更復雜的編碼方式對屬性文件的名稱進行編碼,不僅指定它們所使用的環境,還包括更多信息(例如持久性提供程序)。例如,我們可以使用以下類型的屬性文件:persistence-h2.properties, persistence-mysql.properties,甚至更具體:persistence-dev_h2.properties, persistence-staging_mysql.properties, persistence-production_amazonRDS.properties.

這種命名約定帶來的優勢在於,它僅僅是一種約定,不會影響整體方法——即透明性。通過查看名稱,現在可以更清楚地瞭解配置的作用:

  • persistence-dev_h2.properties: 用於 dev 環境的持久性提供程序是一個輕量級的內存數據庫 H2
  • persistence-staging_mysql.properties: 用於 staging 環境的持久性提供程序是一個 MySQL 實例
  • persistence-production_amazonRDS.properties: 用於 production 環境的持久性提供程序是 Amazon RDS

7. 結論

本文討論了一種靈活的解決方案,用於在 Spring 中進行環境特定配置。 另一種使用配置文件(使用配置文件)的解決方案可以在這裏找到:https://www.javacodegeeks.com/2012/06/spring-31-profiles-and-tomcat.html

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.