目錄
1. 配置必須具有環境特定性
配置必須具有環境特定性——這只是一個事實。如果不是這樣,那就不再是配置,我們只是會在代碼中硬編碼值。
對於 Spring 應用,您可以選擇多種解決方案——從簡單方案到高度靈活、極其複雜的替代方案。
其中一種更常見且直接的解決方案是靈活地使用 屬性文件,以及 Spring 提供的第一類屬性支持。
作為概念驗證,為了本文的目的,我們將研究一種特定的屬性類型——數據庫配置。使用不同的數據庫配置對於生產環境、測試環境和開發環境來説,這完全有道理。
2. 環境下的 .properties 文件
讓我們開始我們的概念驗證 – 通過定義我們想要針對的環境:
-
- Dev
- Staging
- Production
720
接下來 – 創建 3 個 properties 文件,每個文件對應一個環境:
- persistence-dev.properties
- persistence-staging.properties
- 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=dev5. 測試與 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