經過 spring 容器內建的 profile 功能實現開發環境、測試環境、生產環境配置自動切換

軟件開發的通常流程爲工程師開發 -> 測試 -> 上線,所以就涉及到三個不一樣的環境,開發環境、測試環境以及生產環境,一般這三個環境會有不少配置參數不一樣,例如數據源、文件路徑、url等,若是每次上線一個新版本時都手動修改配置會十分繁瑣,容易出錯。spring 爲咱們提供了 profile 機制來解決這個問題。html


spring容許咱們經過定義 profile 來將若干不一樣的 bean 定義組織起來,從而實現不一樣環境自動激活不一樣的 profile 來切換配置參數的功能,下面介紹以 xml 的方式定義 profile、如何激活 profile以及定義默認的 profile,整個過程我以配置不一樣環境的數據源爲例,爲了簡化配置,這裏假設只有開發和生產兩個環境。java


數據源定義爲mysql

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${jdbc.user}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />   
    <property name="driverClass" value="${jdbc.driverClass}" />
    <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
    <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
    <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
    <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
    <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
    <property name="preferredTestQuery" value="${c3p0.preferredTestQuery}"/>
</bean>

classpath下外部資源文件有兩個 settings-development.properties 和 settings-production.properties,分別是開發環境和生產環境的數據源配置參數,內容以下


settings-development.propertiesweb

jdbc.user=root
jdbc.password=111111
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/xxx
c3p0.minPoolSize=5 
c3p0.initialPoolSize=5
c3p0.acquireIncrement=5
c3p0.maxIdleTime=3600
c3p0.idleConnectionTestPeriod=3600
c3p0.preferredTestQuery=select 1

settings-production.properties

jdbc.user=xxx
jdbc.password=xxxx
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///xxx
c3p0.minPoolSize=20 
c3p0.initialPoolSize=20
c3p0.acquireIncrement=10
c3p0.maxIdleTime=3600
c3p0.idleConnectionTestPeriod=3600
c3p0.preferredTestQuery=select 1

1. 定義 profile

如今就能夠經過定義 profile 來將開發和生產環境的數據源配置分開,這裏咱們定義兩個 profile,一個名稱是 development,另外一個名稱是 production(配置到Spring的配置文件中便可)spring

<!-- 開發環境配置文件 -->
<beans profile="development">
    <context:property-placeholder location="classpath:settings-development.properties"/>
</beans>
 
<!-- 生產環境配置文件 -->
<beans profile="production">
    <context:property-placeholder location="classpath:settings-production.properties"/>
</beans>

2. 定義默認 profile

默認 profile 是指在沒有任何 profile 被激活的狀況下,默認 profile 內定義的內容將被使用,一般能夠在 web.xml 中定義全局 servlet 上下文參數 spring.profiles.default 實現,代碼以下sql

<!-- 配置spring的默認profile -->
<context-param>
    <param-name>spring.profiles.default</param-name>
    <param-value>development</param-value>
</context-param>

固然此種方式也是使用默認profile的方式,即若是不指定激活哪一個環境則使用默認方式加載文件緩存

<beans profile="default">
        <context:property-placeholder ignore-resource-not-found="true" location="classpath:application.properties"/>
    </beans>



3. 激活 profile (目前採用的方式)

spring 爲咱們提供了大量的激活 profile 的方法,能夠經過代碼來激活,也能夠經過系統環境變量、JVM參數、servlet上下文參數來定義 spring.profiles.active 參數激活 profile,這裏咱們經過定義 JVM 參數實現。tomcat

在生產環境中,以 tomcat 爲例,咱們在 tomcat 的啓動腳本中加入如下 JVM 參數bash

1
-Dspring.profiles.active= "production"

而開發環境中不須要定義該參數,若是不定義,則會使用咱們指定的默認 profile ,在這裏也就是名稱爲 development 的 profile。這樣當項目部署到不一樣的環境時,即可以經過 JVM 參數來實現不一樣環境 profile 自動激活。app


4. 延伸

該參數還能夠延伸,以致於咱們能夠在 java 代碼中繼續經過該參數來區分不一樣的環境,從而執行不一樣的操做,代碼以下

public class Config {
      public static String ENV = "development";
}
public class InitConfigListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        //偵測jvm環境,並緩存到全局變量中
        String env = System.getProperty("spring.profiles.active");
        if(env == null) {
            Config.ENV = "development";
        } else {
            Config.ENV = env;
        }
    }
}

在項目初始化時獲取到該參數後,咱們即可以在項目任何位置使用,來執行一些不一樣環境須要區別對待的操做,例如統計流量的代碼只須要在生產環境激活,就能夠在jsp中加入以下代碼

<!-- 生產環境統計、推送代碼 -->
<c:if test="${env == 'production' }">
<script>
//統計代碼
..
</script>
</c:if>

原文地址:http://blog.lifw.org/post/68990012

相關文章
相關標籤/搜索