Spring3.1环境与profile

Posted Java全栈从0到1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring3.1环境与profile相关的知识,希望对你有一定的参考价值。

程序运行有多个环境,比如开发环境、测试环境、生产环境等。

在每个环境中,很多东西有不同的做法,如使用的数据库等。

为了避免在切换运行环境是需要对程序进行大量修改,Spring提供了profile设置,使程序能对不同环境做出对应的处理。

使用profile,可以使一个部署单元(如war包)可以用于不同的环境,内部的bean会根据环境所需而创建。

1、配置profile bean

Java配置profile

使用@Profile注解指定bean属于哪个profile

针对类,表明这个类下所有的bean都在对应profile激活时才创建

@Configuration
@Profile("dev")
public class DataSourceConfig {
  @Bean(destroyMethod = "shutdown")
  public DataSource embeddedDataSource() {
    return new EmbeddedDatabaseBuilder().build();
  }
}

针对方法,表明

@Configuration
public class DataSourceConfig {
  @Bean(destroyMethod = "shutdown")
  @Profile("dev")
  public DataSource embeddedDataSource() {
    return new EmbeddedDatabaseBuilder().build();
  }
  @Bean
  @Profile("prod")
  public DataSource jndiDataSource() {
    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();return (DataSource) jndiObjectFactoryBean.getObject();
  }
}

 XML配置profile

设置整个XML文件属于某个profile, 每一个环境创建一个XML文件,把这些XML文件都放在部署环境中,根据环境自动调用

<?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"
    profile="dev">
    
    <jdbc:embedded-database id="dataSource" type="H2">
      <jdbc:script location="classpath:schema.sql" />
      <jdbc:script location="classpath:test-data.sql" />
    </jdbc:embedded-database>
    
</beans>

 也可以通过嵌套<beans>元素,在同一个XML文件下创建不同profile 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:test-data.sql" />
    </jdbc:embedded-database>
  </beans>
  
  <beans profile="prod">
    <jee:jndi-lookup id="dataSource"
      lazy-init="true"
      jndi-name="jdbc/myDatabase"
      resource-ref="true"
      proxy-interface="javax.sql.DataSource" />
  </beans>
</beans>

2、激活profile

1、没有指定profile的bean任何时候都会创建

2、根据spring.profiles.active属性,找到当前激活的profile

3、如果active属性没有设置,则找spring.profiles.default属性,找到默认的profile

4、如果2个值都没有设置,则不会创建任何定义在profile里面的bean

spring.profiles.active,spring.profiles.default2个参数的设置方式:

1、作为DispatcherServlet的初始化参数;

2、作为Web应用的上下文参数;

3、作为JNDI条目;

4、作为环境变量;

5、作为JVM的系统属性;

6、在集成测试类上,使用@ActiveProfiles注解设置

具体写法,后面的例子会讲到

3、使用profile进行测试

使用@ActiveProfiles注解

  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration(classes=DataSourceConfig.class)
  @ActiveProfiles("prod")
  public static class ProductionDataSourceTest {
    @Autowired
    private DataSource dataSource;
    
    @Test
    public void shouldBeEmbeddedDatasource() {
      // should be null, because there isn‘t a datasource configured in JNDI
      assertNull(dataSource);
    }
  }

以上是关于Spring3.1环境与profile的主要内容,如果未能解决你的问题,请参考以下文章

spring profile 多环境配置管理

spring profile 多环境配置管理

Spring 环境与profile——超简用例

如何通过属性文件而不是通过 env 变量或系统属性设置活动 spring 3.1 环境配置文件

Spring Boot 揭秘与实战 配置文件篇 - 有哪些很棒的特性

bashrc 与 profile