Spring profile 详解

  • 当我们在开发中,使用数据库连接的时候,往往是测试的时候连接测试数据库,生产环境用的是生产环境的数据库。 
    这两个数据库的用户名密码往往是不同的。但是当我们打完包上线app到生产环境中去的时候,发现数据库的用户名密码用的是测试数据库的用户名密码。 
    这时候就很麻烦了。所以从Spring3开始提供了profile的功能。 
    就是当环境符合那个profile就激活哪个profile。 
    这里我们用Dao去演示,里面的成员变量封装了数据库的类型,数据库的用户名和密码 
    正式开发的时候,这里应该是DataSource

首先我们先写一个dao

package org.huluo.springapiprofile;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SpringProfileDao {

    //我们在使用不同的profile的时候可以根据不同的环境激活不同profile来拿到不同的值
    @Value("#{config.username}")
    private String username;
    @Value("#{config.password}")
    private String password;
    @Value("#{config.dbtype}")
    private String dbType;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDbType() {
        return dbType;
    }

    public void setDbType(String dbType) {
        this.dbType = dbType;
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这里我们先贴上配置文件的代码。配置文件的配置分别是生产环境下的和开发环境下的数据库用户名和密码以及数据库的类型。

dev.properties配置文件 –> 配置的是开发环境下的数据库用户名密码和数据库的类型

username=hello
password=world
dbtype=derby
 
 
  • 1
  • 2
  • 3

produce.properties配置文件 —> 自然就是对应的生产环境下的配置文件

username=root
password=root
dbtype=mysql
 
 
  • 1
  • 2
  • 3

再进行Spring配置,这里我们选择xml的配置方式

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
    <!-- 定义开发的profile -->
    <beans profile="development">
        <!-- 只扫描开发环境下使用的类 -->
        <context:component-scan base-package="org.huluo.springapiprofile"/>
        <!-- 加载开发使用的配置文件 -->
        <util:properties id="config" location="classpath:springprofileapitest/dev.properties"/>
    </beans>


    <!-- 定义生产使用的profile -->
    <beans profile="produce">
        <!-- 只扫描生产环境下使用的类 -->
        <context:component-scan
                base-package="org.huluo.springapiprofile"/>
        <!-- 加载生产使用的配置文件 -->
        <util:properties id="config" location="classpath:springprofileapitest/produce.properties"/>
    </beans>


</beans>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

我们可以看到笔者这里配置了两个profile他们的名字分别是:development和produce

现在我们写一个单元测试去测试一下

package org.huluo.springapiprofile;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:spring/ctx-profiletest.xml")
/**
 *使用该注解激活produce情况下的profile
 * 激活profile的条件还有其他的方式,并且是更常用的方式
 * 比如说像在web.xml里去配置
 *  <context-param>
 *      <param-name>spring.profiles.active</param-name>
 *      <param-value>jpa</param-value>
 *  </context-param>
 *  该配置的意思是激活 名字为 jpa的profile
 */
@ActiveProfiles(value = "produce")
public class SpringProfileDaoTest {


    @Autowired
    private SpringProfileDao springProfileDao;

    @Test
    public void testName() throws Exception {
        System.out.println(springProfileDao.getUsername());
        System.out.println(springProfileDao.getPassword());
        System.out.println(springProfileDao.getDbType());
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

这里我们激活的是produce的profile 
所以打印出来的应该是:

root
root
mysql
 
 
  • 1
  • 2
  • 3

运行的结果如下

当然还有其他的方式去激活profile,比如说

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>webenv</param-value>
  </context-param>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值