从 Spring Boot 的组件扫描中排除 class

Exclude class from ComponentScan of SpringBoot

我有两个 classes,其中我想在 运行 时只使用一个 class(取决于我是 运行ning 测试还是在服务器(本地或其他)上执行应用程序)并将另一个从 Spring 的组件扫描中排除。

这是我想在测试时使用的第一个 class:

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();
    }
}

这是在生产或本地执行期间使用的第二个 class:

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 设置兼容的解决方案,以便部署可以顺畅无忧。

您可以使用配置文件。

@ActiveProfiles("test") 注释你的集成测试,用 @Profile("test") 注释你的集成测试应该加载的组件,用 @Profile("!test")[= 注释不应该为集成测试加载的组件13=]