在Spring Test配置上使用@Profile和@ActiveProfiles有什么区别
@Configuration
@EnableRetry
@ActiveProfiles("unittest")
static class ContextConfiguration {
和
@Configuration
@EnableRetry
@Profile("unittest")
static class ContextConfiguration {
答案 0 :(得分:7)
简而言之,@Profile
定义了一个配置文件,例如Debug概要文件和Production概要文件等。但是,@ActiveProfiles
出现在ApplicationContext
情况下,并定义了哪些配置文件如果正在使用相应的ApplicationContext
,则应该处于活动状态。
如Spring官方网站的JavaDoc中所述:
配置文件是一个命名的逻辑分组,可以通过ConfigurableEnvironment.setActiveProfiles(java.lang.String ...)以编程方式激活,也可以通过将spring.profiles.active属性设置为JVM系统属性(作为环境变量)以声明方式激活,或作为Web应用程序的web.xml中的Servlet上下文参数。在集成测试中,也可以通过@ActiveProfiles注释以声明方式激活配置文件。
ActiveProfiles是一个类级别的批注,用于声明在为测试类加载ApplicationContext时应使用哪些活动bean定义配置文件。
答案 1 :(得分:3)
任何@Component或@Configuration都可以标记为 @Profile 以限制 加载时。
您为您定义@Profile
:
@Component
直接或间接注释的类,包括@Configuration
类@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。