通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境、测试环境以及生产环境,通常这三个环境会有很多配置参数不同,例如数据源、文件路径、url等,如果每次上线一个新版本时都手动修改配置会十分繁琐,容易出错。spring 为我们提供了 profile 机制来解决这个问题。


spring允许我们通过定义 profile 来将若干不同的 bean 定义组织起来,从而实现不同环境自动激活不同的 profile 来切换配置参数的功能,下面介绍以 xml 的方式定义 profile、如何激活 profile以及定义默认的 profile,整个过程我以配置不同环境的数据源为例,为了简化配置,这里假设只有开发和生产两个环境。


数据源定义为

<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.properties
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
<!-- 开发环境配置文件 -->
<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 实现,代码如下

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




3. 激活 profile 


spring 为我们提供了大量的激活 profile 的方法,可以通过代码来激活,也可以通过系统环境变量、JVM参数、servlet上下文参数来定义 spring.profiles.active 参数激活 profile,这里我们通过定义 JVM 参数实现。
在生产环境中,以 tomcat 为例,我们在 tomcat 的启动脚本中加入以下 JVM 参数

-Dspring.profiles.active="production"


而开发环境中不需要定义该参数,如果不定义,则会使用我们指定的默认 profile ,在这里也就是名称为 development 的 profile。这样当项目部署到不同的环境时,便可以通过 JVM 参数来实现不同环境 profile 自动激活。


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>
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 对于开发环境测试环境生产环境,可以在application.yml中分别配置不同的属性值,以便在不同的环境中使用不同的配置。可以使用Spring Boot的profile功能,通过在application.yml中配置不同的profile实现不同环境的配置。例如,可以在application.yml中配置如下: ``` spring: profiles: active: dev --- spring: profiles: dev datasource: url: jdbc:mysql://localhost:3306/mydb_dev username: devuser password: devpass --- spring: profiles: test datasource: url: jdbc:mysql://localhost:3306/mydb_test username: testuser password: testpass --- spring: profiles: prod datasource: url: jdbc:mysql://localhost:3306/mydb_prod username: produser password: prodpass ``` 在这个例子中,我们定义了三个不同的profile:dev、test和prod。在dev环境中,我们使用mydb_dev数据库,并使用devuser/devpass作为用户名和密码。在test环境中,我们使用mydb_test数据库,并使用testuser/testpass作为用户名和密码。在prod环境中,我们使用mydb_prod数据库,并使用produser/prodpass作为用户名和密码。当我们启动应用程序时,可以通过设置spring.profiles.active属性来指定要使用的profile。例如,我们可以使用以下命令来启动应用程序: ``` java -jar myapp.jar --spring.profiles.active=dev ``` 这将使用dev环境的配置来启动应用程序。 ### 回答2: 在配置application.yml的开发环境测试环境生产环境时,我们需要注意以下几点: 1. 开发环境配置:可以根据开发人员的需求进行配置,主要包括数据库连接、日志级别、调试模式等。一般情况下,开发环境的配置相对简单,便于快速开发和调试。 2. 测试环境配置:需要与生产环境尽可能保持一致,以确保测试结果的准确性。除了包含开发环境的配置项外,还需要配置测试数据库、缓存服务器和第三方服务,以满足测试人员的需求。 3. 生产环境配置:需要考虑到性能、安全性和可靠性等因素。需要配置生产数据库、缓存服务器集群、负载均衡、日志管理、安全认证等。此外,还需要根据实际情况配置线程池、CDN加速、压缩等功能,以提高应用的性能和稳定性。 在配置上述环境时,可以使用Spring Boot框架提供的Profile功能,可以根据不同的环境加载对应的配置文件。一种常见的做法是创建多个YAML配置文件,如application-dev.yml、application-test.yml和application-prod.yml,分别对应不同的环境。开发人员只需要在启动应用时指定相应的profile,例如添加启动参数--spring.profiles.active=dev,即可加载对应的配置文件。 通过合理配置application.yml的开发环境测试环境生产环境,我们能够更好地满足不同环境下的需求,提高应用的开发效率、测试准确性和生产环境的可靠性。 ### 回答3: 在应用程序的开发、测试和生产环境中,需要适当配置application.yml文件以满足不同环境的需求。以下是配置建议: 1. 开发环境: - 数据库:使用本地数据库,例如H2或者嵌入式的MySQL。 - 日志:使用详细的日志级别,例如DEBUG或TRACE级别,方便开发过程中的调试。 - 缓存:关闭或禁用缓存,以防止开发过程中出现潜在的缓存问题。 - 安全配置:可以将安全配置设置为较低的级别,以便能够方便地进行测试和调试。 - 外部服务:使用模拟或者虚假的外部服务进行开发,以避免对真实的外部服务产生影响。 2. 测试环境: - 数据库:使用测试环境的数据库,数据应该与生产环境有一定的相似性。 - 日志:使用INFO级别的日志,方便查看测试结果。 - 缓存:启用缓存功能,以模拟实际生产环境下的缓存行为。 - 安全配置:根据测试需求,设置适当的安全级别。 - 外部服务:使用真实的外部服务进行测试,确保应用程序在与真实环境进行交互时的正常运行。 3. 生产环境: - 数据库:使用生产环境的数据库,确保数据的安全和稳定性。 - 日志:使用WARN级别或更高的日志级别,减少日志信息量,保护敏感信息。 - 缓存:根据具体需求配置合适的缓存策略,保证系统性能和可用性。 - 安全配置:根据实际需求配置高级别的安全措施,保护系统免受潜在安全威胁。 - 外部服务:使用真实的外部服务,并根据生产环境配置正确的外部服务地址。 总之,通过适当配置application.yml文件,可以使应用程序在开发、测试和生产环境下顺利运行,并满足各环境的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值