Что произойдет в Spring, если я использую аннотацию @ActiveProfiles в классе конфигурации, а не в классе, который определяет мои компоненты?

Я учусь на сертификацию Spring Core, и у меня есть некоторые сомнения, связанные с использованием профилей в тестах JUnit.

Так что я знаю, что если я буду комментировать класс следующим образом:

@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
    }
}

Я объявляю служебный компонент, который принадлежит профилю заглушки.

Итак, если мой тестовый класс будет примерно таким:

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

это означает, что будет использоваться компонент EJB, принадлежащий профилю заглушки, и компонент, не имеющий профиля. Это правильно или я что-то упустил?

Что произойдет, если вместо этого использовать аннотацию @ActiveProfiles для класса (экземпляром которого будет Spring bean-компонент), который я использую для класса конфигурации Java?

Как то так:

@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 для ** класса конфигурации * вместо того, чтобы аннотировать непосредственно мои компоненты?

Tnx

2 ответа

Решение

Если вы посмотрите на JavaDoc ActiveProfiles аннотация, она содержит этот текст:

ActiveProfiles - это аннотация уровня класса, которая используется для объявления, какие профили определения активных компонентов следует использовать при загрузке ApplicationContext для тестовых классов.

Это означает, что он должен использоваться только для объявления активных профилей Spring для тестовых классов. Так что если поместить его в класс Configuration, это не должно иметь никакого эффекта.

А что касается @Profile аннотации, его можно использовать как на уровне метода, так и на уровне класса. Если вы используете его на метод аннотированный @Bean в классе конфигурации только этот компонент будет принадлежать профилю. Если вы используете его в классе конфигурации, он будет применен ко всем bean-компонентам в классе конфигурации, если вы используете его в @Component class, профиль будет применен к компоненту, представленному этим классом.

@Profile Аннотация JavaDoc предоставляет более подробное объяснение этих правил.

Почему я должен использовать аннотацию @Profile для ** класса конфигурации * вместо того, чтобы аннотировать непосредственно мои компоненты?

Хорошо, если все компоненты в данном классе конфигурации должны быть активны только для определенных профилей, то имеет смысл объявить это глобально в классе конфигурации, чтобы избежать необходимости индивидуально определять профиль для всех компонентов. Но если бы вы аннотировали все индивидуальные компоненты, это также сработало бы.

Нотация — это способ указать, какие профили Spring должны быть активны в конкретном контексте. Это полезно для объявления того, какие bean-компоненты должны быть созданы и какие конфигурации должны быть применены. Пример использованияобозначение будет:

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

В этом примере профиль «тест» активен для класса MyTestClass. Это означает, что любые bean-компоненты или конфигурации, связанные с профилем «test», будут применяться при выполнении любых тестов в этом классе.

Другие вопросы по тегам