当前位置: 首页 > 知识库问答 >
问题:

在Spring中,@Profile和@ActiveProfiles有什么区别

鄂琛
2023-03-14

在Spring测试配置中使用@Profile和@ActiveProfiles有什么区别

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

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

共有3个答案

司健柏
2023-03-14

任何@Component或@Configuration都可以用@Profile标记,以限制它何时被加载。

您为以下内容定义了@Profile

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

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

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

如果在测试上下文之外使用,它没有效果。

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

王景山
2023-03-14

简而言之,@Profile定义了一个配置文件,如调试配置文件和生产配置文件等...但是@ActiveProfilesApplication Context的情况下出现,并定义了如果使用相应的Application Context,哪些配置文件应该是活动的。

如Spring官方网站JavaDoc中所述:

@简介

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

@ActiveProfiles

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

另外,你可以在这里看到更多关于@Profile的信息

龙佐
2023-03-14

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

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

要将配置文件标记为活动的,必须在< code > application . properties 中设置< code > spring . profiles . active 属性,或者作为VM参数以< code >-dspring . profiles . active = dev 的形式给出

在编写Junit时,您可能想要激活某个概要文件,以便加载所需的配置或组件。使用< code>@ActiveProfile注释也可以达到同样的效果。

考虑映射到配置文件< code>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());
    }
}

考虑映射到配置文件< code>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')annotation。这将加载在开发概要文件中定义的DataSourceConfig bean。

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

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

}

结论

@Profile用于将类映射到配置文件

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

 类似资料:
  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。

  • 只需在Xpath中添加即可--它突出显示--各种页面元素----它表示什么? 下面是用于Gmail密码字段的XPaths。的意义是什么? >

  • 本文向大家介绍Spring Boot、Spring MVC 和 Spring 有什么区别?相关面试题,主要包含被问及Spring Boot、Spring MVC 和 Spring 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 SpringFramework SpringFramework 最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。 当我

  • Spring Boot中的和注释有什么区别?有必要加上这些吗?我的应用程序在没有这些注释的情况下工作得很好。我只想明白为什么我们要加上它们。

  • 本文向大家介绍Dubbo 和 Spring Cloud 有什么区别?相关面试题,主要包含被问及Dubbo 和 Spring Cloud 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 两个没关联,如果硬要说区别,有以下几点。 1)通信方式不同 Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。 2)组成部分不同 最大的区别:Dubb