1. 程式人生 > >spring 多環境配置

spring 多環境配置

Spring的profiles機制,是應對多環境下面的一個解決方案,比較常見的是開發和測試環境的配置。

配置專案

Spring的profiles有兩個變數可以配置

  • spring.profiles.default 預設值,優先順序低。當active沒有配置時,使用此變數。
  • spring.profiles.active 優先順序高,指定當前容器使用哪個profile。

一般用法

宣告多profile

如果使用spring的profiles機制,第一步要在applicationContext.xml中配置多環境例項。

 <beans profile="development">
    <!-- 開發環境,具體載入bean或者properties檔案 -->
</beans> <beans profile="test"> <!-- 測試環境,具體載入bean或者properties檔案 --> </beans>

啟用profile

在J2EE專案中,一般通過web.xml配置。

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>development</param-value>
</context-param
>

或者

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>test</param-value>
</context-param>

兩個方式都可以,一般推薦第一種。主要原因在於:方便擴充套件,沒有指定具體profile,可通過其他方式覆蓋;一般情況下開發環境是使用最多的情況。

測試環境啟用profile

Spring-test 中提供了一個__ActiveProfiles__的註解,可以標註當前測試用例使用的具體profile

@ActiveProfiles("test")
public abstract class SpringTransactionalTestCase {
}

使用java執行引數指定profiles

java執行時可以指定jvm記憶體引數,這個大家都知道。形式類似下面這樣去指定java虛擬機器啟動的記憶體設定。

JAVA_OPTS=" -Xms1024m -Xmx1024m  -XX:PermSize=512m -XX:MaxPermSize=512m"

Java也可以指定啟動的環境變數,比如CATALINA_HOME啊之類的,通過ps命令,可以清楚的看到,java啟動的時候不同的軟體是通過不同的-D引數來達到效果的。tomcat的啟動情況:

root      2284     1  0 316 ?       00:01:54 /opt/jdk/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.0.32/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -Djava.endorsed.dirs=/opt/apache-tomcat-8.0.32/endorsed -classpath /opt/apache-tomcat-8.0.32/bin/bootstrap.jar:/opt/apache-tomcat-8.0.32/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-8.0.32 -Dcatalina.home=/opt/apache-tomcat-8.0.32 -Djava.io.tmpdir=/opt/apache-tomcat-8.0.32/temp org.apache.catalina.startup.Bootstrap start

回到正題,那這樣,是不是也可以通過這種形式,來指定profile的呢?答案是肯定的。
修改tomcat啟動指令碼,直接修改JAVA_OPTS:

JAVA_OPTS=" -Xms1024m -Xmx1024m  -XX:PermSize=512m -XX:MaxPermSize=512m -Dspring.profiles.active=test"

啟動tomcat,發現整個系統啟動時,使用profile=test的bean被激活了,證明配置生效。

總結

使用java的系統引數-D方式即減輕了耦合性,也降低了開發和維護之間交流協作的部分。當有多個部署環境時,提前部署好指定的profile,這點在datasource的指定上面極為好用。