zoukankan      html  css  js  c++  java
  • Spring 环境与profile(一)——超简用例

    什么是profile,为什么需要profile?

    在开发时,不同环境(开发、联调、预发、正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码、重新构建)而且容易出错。Spring提供了解决方案。

    方法一:配置profile bean

    @Configuration
    public class DataSourceConfig {
    
      //Spring 引入@Profile 制定某个bean属于哪个profile
      //在方法级别上使用@Profile注解
    @Bean @Profile("dev") public DataSource embeddedDataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:dev-data.sql") .build(); } @Bean @Profile("prod") public DataSource embeddedDataSourceDev() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:prod-data.sql") .build(); } }

    在同一个类的不同方法上使用@Profile注解与@Bean一起使用

    方法二:在XML中配置bean

    与方法一等价的方式

    <?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:jdbc="http://www.springframework.org/schema/jdbc"
      xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p"
      xsi:schemaLocation="
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/jdbc
        http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    
      <beans profile="dev">
        <jdbc:embedded-database id="dataSource" type="H2">
          <jdbc:script location="classpath:schema.sql" />
          <jdbc:script location="classpath:dev-data.sql" />
        </jdbc:embedded-database>
      </beans>
    
      <beans profile="prod">
        <jdbc:embedded-database id="dataSource" type="H2">
          <jdbc:script location="classpath:schema.sql" />
          <jdbc:script location="classpath:prod-data.sql" />
        </jdbc:embedded-database>
      </beans>
    </beans>

    激活profile

    Spring在确定哪个profile处于激活状态时,需要依赖两个独立属性:sping.profiles.active和spring.profiles.default。Spring提供了@ActiveProfiles用来指定运行测试时要激活哪个profile,如果没有指定sping.profiles.active,会采用spring.profiles.default的默认值。

    测试

    package profiles;
    
    import static org.junit.Assert.*;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.sql.DataSource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.myapp.DataSourceConfig;
    
    public class DataSourceConfigTest {
    
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(classes=DataSourceConfig.class)
      @ActiveProfiles("dev")
      public static class DevDataSourceTest {
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void shouldBeEmbeddedDatasource() {
          assertNotNull(dataSource);
          JdbcTemplate jdbc = new JdbcTemplate(dataSource);
          List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() {
            @Override
            public String mapRow(ResultSet rs, int rowNum) throws SQLException {
              return rs.getLong("id") + ":" + rs.getString("name");
            }
          });
    
          assertEquals(1, results.size());
          assertEquals("1:A", results.get(0));
        }
      }
    
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration("classpath:datasource-config.xml")
      @ActiveProfiles("prod")
      public static class ProductionDataSourceTest_XMLConfig {
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void shouldBeEmbeddedDatasource() {
          assertNotNull(dataSource);
          JdbcTemplate jdbc = new JdbcTemplate(dataSource);
          List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() {
            @Override
            public String mapRow(ResultSet rs, int rowNum) throws SQLException {
              return rs.getLong("id") + ":" + rs.getString("name");
            }
          });
    
          assertEquals(1, results.size());
          assertEquals("1:B", results.get(0));
        }
      }
    
    }

    代码

    地址

  • 相关阅读:
    hdoj 1002大数加法
    nuxt踩坑
    vue 打包上线后 css3渐变属性丢失的问题解决方案
    linux下crontab不能运行问题
    [转]谈谈数据库的ACID
    web集群时session共享
    redis缓存队列+MySQL +php任务脚本定时批量入库
    Yii2 加载css、js 载静态资源
    PHP实现四种基本排序算法
    phpstorm快捷键
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/8763683.html
Copyright © 2011-2022 走看看