java - 在 spring 中,@Profile 和 @ActiveProfiles 之間的區別是什麼

  显示原文与译文双语对照的内容
125 2

在 spring 測試配置中使用 @Profile 和 @ActiveProfiles的區別是什麼

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

@Configuration
@EnableRetry
@Profile("unittest") 
static class ContextConfiguration {
时间:原作者:0个回答

146 3

簡而言之,@Profile 定義了像調試概要文件那樣的概要文件,但是如果在 ApplicationContext 中出現了 @ActiveProfiles,那麼在使用了相應的ApplicationContext 時,將會顯示出哪些概要文件處於活動狀態。

就像 spring 官方網站的JavaDoc中所提到的:

@Profile

概要文件是名為logical的邏輯分組,通過 ConfigurableEnvironment.setActiveProfiles(java.lang.String...) 或者通過在web應用程序的web.xml 中將 spring.profiles.active 屬性設置為一個JVM系統屬性或者作為一個Servlet上下文參數,以編程方式激活。配置文件也可以通過 @ActiveProfiles 註釋在集成測試中以聲明方式激活。

@ActiveProfiles

ActiveProfiles是類級註釋,用於聲明載入一個ApplicationContext時應該使用哪個活動bean定義概要文件。

另外,你可以在這裡看到更多關於 @Profile的信息。

原作者:
66 4

任何 @Component 或者 @Configuration 都可以標記為 @Profile,以便在載入時限制。

為你的用戶定義 @Profile:

  • @Component 註釋的-directly或者indirectly-類,包括 @Configuration
  • @Bean 註釋的方法

在測試時,通過在 @ActiveProfiles 中指定哪個概要文件來選擇你想要的概要文件。

ActiveProfiles 是類級註釋,用於聲明在載入一個ApplicationContext時應該使用哪個活動bean定義概要文件,以便為測試類。

如果在測試上下文之外使用,則無效。

摘要

你可以以使用 @Profile 將配置文件分配給你的組件;而測試則用 @ActiveProfiles 選擇它們,而開發。

原作者:
90 0

spring 配置文件提供了隔離應用程序配置部分的方法。

在負載載入時,任何 @Component 或者 @Configuration 都可以用 @Profile 標記,這意味著只有當活動配置文件與映射到組件的配置文件相同時,才會在應用程序上下文中載入組件或者配置。

若要標記配置文件,必須在 application.properties 中設置 spring.profiles.active 屬性,或者作為 -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測試類執行期間激活特定的概要文件

原作者:
132 3
  • @Profile 註釋中,你可以設置條件到bean定義,這會影響創建或者不在 spring 上下文中根據當前活動概要文件創建。來自 java doc的示例:

    如果配置文件'p1'處於活動狀態,則將進行註冊,如果配置文件'p2'為 active,則為

  • 使用 @ActiveProfiles,你可以設置當前活動配置文件。例如:

    帶註釋的@ActiveProfiles({"p2","p3"}) bean將不能創建

    將創建帶有註釋 @Profile({"p1","p2"}@ActiveProfiles({"p3"}) bean 。!

    將創建帶有註釋 @Profile({"p1","p2"}@ActiveProfiles({"p1"}) bean 。!

原作者:
...