Исключить класс из ComponentScan в SpringBoot
У меня есть два класса, из которых я хочу использовать только один класс во время выполнения (в зависимости от того, запускаю ли я тесты или запускаю приложение на сервере (локальном или ином)) и исключаю другой из компонента Spring Scanning Scanning.
Вот 1-й класс, который я хочу использовать при тестировании:
public class HibernateUtilForH2 implements HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration configuration = new Configuration().configure("hibernate.cfg.xml.h2");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
} catch (Exception ex) {
throw new ExceptionInInitializerError(ex);
}
}
public Session openSession() {
return sessionFactory.openSession();
}
}
Вот второй класс для использования во время производства или локального исполнения:
public class HibernateUtilForMySql implements HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
} catch (Exception ex) {
throw new ExceptionInInitializerError(ex);
}
}
HibernateUtil
вот интерфейс, содержащий объявление openSession()
только метод.
я хочу HibernateUtilForH2
вводиться с помощью DI при тестировании и HibernateUtilForMySql
использоваться для производства или исполнения на локальном сервере. Как я могу это сделать?
Я пытался использовать @TestComponent
а также @ConditionalOnWebApplication
но ни один из них не работает. Мне нужно решение, которое совместимо с настройкой GitLab для CI/CD, чтобы развертывание могло быть плавным и беспроблемным.
1 ответ
Вы могли бы работать с профилями.
Аннотируйте свой интеграционный тест с помощью @ActiveProfiles("test")
и ваш компонент, который должен быть загружен для интеграционных тестов с @Profile("test")
и компоненты, которые не должны быть загружены для интеграционных тестов с @Profile("!test")