在Spring中,@ Prefile和@ActiveProfiles之间有什么区别

时间:2017-05-18 19:06:09

标签: java spring

在Spring Test配置上使用@Profile和@ActiveProfiles有什么区别

@Configuration
@EnableRetry
@ActiveProfiles("unittest") 
static class ContextConfiguration {

@Configuration
@EnableRetry
@Profile("unittest") 
static class ContextConfiguration {

6 个答案:

答案 0 :(得分:7)

简而言之,@Profile定义了一个配置文件,例如Debug概要文件和Production概要文件等。但是,@ActiveProfiles出现在ApplicationContext情况下,并定义了哪些配置文件如果正在使用相应的ApplicationContext,则应该处于活动状态。

如Spring官方网站的JavaDoc中所述:

@Profile

  

配置文件是一个命名的逻辑分组,可以通过ConfigurableEnvironment.setActiveProfiles(java.lang.String ...)以编程方式激活,也可以通过将spring.profiles.active属性设置为JVM系统属性(作为环境变量)以声明方式激活,或作为Web应用程序的web.xml中的Servlet上下文参数。在集成测试中,也可以通过@ActiveProfiles注释以声明方式激活配置文件。

@ActiveProfiles

  

ActiveProfiles是一个类级别的批注,用于声明在为测试类加载ApplicationContext时应使用哪些活动bean定义配置文件。

此外,您可以see here for more information about @Profile

答案 1 :(得分:3)

  

任何@Component或@Configuration都可以标记为 @Profile 以限制   加载时。

您为您定义@Profile

  1. 使用@Component直接或间接注释的类,包括@Configuration
  2. @Bean注释的方法

然后,在测试时,您可以通过在@ActiveProfiles中指定配置文件来选择所需的配置文件。

  

ActiveProfiles 是用于声明的类级注释   加载文件时应使用哪些活动bean定义配置文件   测试类的ApplicationContext。

如果在测试环境之外使用,则无效。

摘要

您使用@Profile将配置文件分配给组件;在测试时,使用@ActiveProfiles选择它们,而在开发时,使用spring.profiles.active属性选择它们。

答案 2 :(得分:2)

Spring Profiles提供了一种隔离应用程序配置各部分的方法。

任何@Component@Configuration都可以用@Profile标记以限制加载时间,这意味着仅当活动配置文件相同时,组件或配置才会在应用程序上下文中加载作为映射到组件的配置文件。

要标记配置文件为活动状态,必须在spring.profiles.active中设置application.properties属性,或将其作为VM参数指定为-Dspring.profiles.active=dev

在编写Junit时,您需要激活一些配置文件以加载所需的配置或组件。通过使用@ActiveProfile批注可以实现相同的目的。

考虑一个映射到配置文件dev的配置类

@Configuration
@Profile("dev")
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost/test");
        ds.setUsername("root");
        ds.setPassword("mnrpass");
        return ds;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }
}

考虑一个映射到配置文件prod的配置类

@Configuration
@Profile("prod")
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:oracle://xxx.xxx.xx.xxx/prod");
        ds.setUsername("dbuser");
        ds.setPassword("prodPass123");
        return ds;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }
}

因此,如果要在dev配置文件中运行junit测试用例,则必须使用@ActiveProfile('dev')批注。这将加载在dev概要文件中定义的DataSourceConfig bean。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@ActiveProfiles("dev")
public class Tests{

    // Junit Test cases will use the 'dev' profile DataSource Configuration

}
  

结论

@Profile用于将类映射到个人资料

@ActiveProfile用于在junit测试类执行期间激活特定配置文件

答案 3 :(得分:1)

@Profile用于为不同的上下文定义不同的@Bean定义,例如:

public class BeanConfiguration {
    @Bean
    @Profile({"local", "dev", "ci-dev", "homolog"})
    public SomeHttpClientBean adyenClientFactorySandbox() {
        return SomeHttpClientBean.builder()
            .url("https://test.example.com")
            .build();
    }

    @Bean
    @Profile("prod")
    public SomeHttpClientBean adyenClientFactorySandbox() {
        return SomeHttpClientBean.builder()
            .url("https://production.example.com")
            .build();
    }
}

有了该配置后,在启动应用程序时,您需要做的就是通过spring.profiles.active属性或通过注释类来设置哪个配置文件处于活动状态:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@ActiveProfiles("ci-dev")
public class SpringBootTestBase {
    @Test
    ...
}

答案 4 :(得分:1)

@Profile用于声明 bean或配置。 @Profile声明Bean或配置属于哪个配置文件。

@ActiveProfiles仅用于消费一个bean或配置以启用一个或多个配置文件的测试。

指定@ActiveProfiles时,它将导致Spring Context检查是否用@Profile注释了bean或配置。如果是这样,则只有在@ActiveProfiles中的配置文件与bean的@Profile批注中的配置文件规则匹配时,才会加载该bean或配置。

答案 5 :(得分:0)

  • 使用@Profile批注将条件设置为bean定义,这会影响在spring上下文中根据当前活动配置文件创建或不创建此bean。来自JavaDoc的示例:

    @Profile({"p1", "!p2"}-如果配置文件“ p1”处于活动状态,则会进行注册 (如果配置文件“ p2”未激活)。

  • 使用@ActiveProfiles设置当前的活动配置文件。示例:

    不会创建带有注释@ActiveProfiles({"p2","p3"})

    @Profile({"p1", "!p2"} bean。

    将创建带有注释@ActiveProfiles({"p3"})

    @Profile({"p1", "!p2"} bean。

    将创建带有注释@ActiveProfiles({"p1"})

    @Profile({"p1", "!p2"} bean。