如果我在一个配置类上使用@ActiveProfiles注解而不是在定义我的bean的类上使用它,那么在Spring中会发生什么?

13

我正在学习Spring Core认证,对在JUnit测试中使用配置概要文件(profiles)有一些疑问。

我知道如果我将一个类注释如下:

@Profile("stub")
@Repository
public class StubAccountRepository implements AccountRepository {

    private Logger logger = Logger.getLogger(StubAccountRepository.class);

    private Map<String, Account> accountsByCreditCard = new HashMap<String, Account>();

    /**
     * Creates a single test account with two beneficiaries. Also logs creation
     * so we know which repository we are using.
     */
    public StubAccountRepository() {
        logger.info("Creating " + getClass().getSimpleName());
        Account account = new Account("123456789", "Keith and Keri Donald");
        account.addBeneficiary("Annabelle", Percentage.valueOf("50%"));
        account.addBeneficiary("Corgan", Percentage.valueOf("50%"));
        accountsByCreditCard.put("1234123412341234", account);
    }

    public Account findByCreditCard(String creditCardNumber) {
        Account account = accountsByCreditCard.get(creditCardNumber);
        if (account == null) {
            throw new EmptyResultDataAccessException(1);
        }
        return account;
    }

    public void updateBeneficiaries(Account account) {
        // nothing to do, everything is in memory
    }
}

我正在声明一个属于“stub”配置文件的服务bean

因此,如果我的测试类像这样:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=TestInfrastructureConfig.class)
@ActiveProfiles("stub")
public class RewardNetworkTests {
    .....................................
    .....................................
    .....................................
}

这意味着将使用属于 stub 配置文件的 Bean,以及那些没有配置文件的 Bean。是这样吗?还是我漏掉了什么?

如果我在一个 Java 配置类 上使用 @ActiveProfiles 注解,会发生什么?

像这样:

@Configuration
@Profile("jdbc-dev")
public class TestInfrastructureDevConfig {

    /**
     * Creates an in-memory "rewards" database populated 
     * with test data for fast testing
     */
    @Bean
    public DataSource dataSource(){
        return
            (new EmbeddedDatabaseBuilder())
            .addScript("classpath:rewards/testdb/schema.sql")
            .addScript("classpath:rewards/testdb/test-data.sql")
            .build();
    }   
}

我应该做什么?我认为在这个类中配置的所有bean都将属于jdbc-dev配置文件,但我不确定。你能给我更多关于这件事的信息吗?

为什么我必须在一个**配置类**上使用@Profile注解,而不是直接注解我的bean?

Tnx

2个回答

22
如果看一下 ActiveProfiles 注释的 JavaDoc,其中包含以下内容:

ActiveProfiles 是一个类级别的注释,用于声明在装入 ApplicationContext 时应使用哪些活动 Bean 定义配置文件用于测试类

意思是它只应该用于声明测试类的活动 Spring 配置文件。所以如果将其放在配置类上,它应该没有任何效果。
至于 @Profile 注释,它可以用于方法和类级别。如果您在配置类中的 @Bean 注释的方法上使用它,则只有该 bean 属于该配置文件。如果您将其用于配置类,则它将应用于配置类中的所有 bean;如果您在 @Component 类上使用它,则配置文件将应用于该类表示的 bean。 @Profile 注释的 JavaDoc 提供了更详细的规则说明。

为什么我必须在 *配置类* 上使用 @Profile 注释而不是直接注释我的 bean?

如果给定配置类中的所有 bean 只应为某些配置文件启用,则将其全局声明在配置类上是有意义的,以避免必须单独在所有 bean 上指定配置文件。但如果您对所有单独的 bean 进行注释,那也可以工作。

0

@ActiveProfiles 注解是一种指定在特定上下文中应该激活哪些 Spring 配置文件的方法。它非常有用,可以声明应该创建哪些 Bean 以及应该应用哪些配置。使用 @ActiveProfiles 注解的示例:

@ActiveProfiles("test")
public class MyTestClass {
    //test methods here
}

在这个例子中,“test”配置文件对于MyTestClass类是激活的。这意味着当运行这个类中的任何测试时,与“test”配置文件相关联的任何bean或配置都将被应用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接