从SpringBoot的ComponentScan中排除类

时间:2017-11-28 10:55:10

标签: java spring-boot spring-boot-test component-scan

我有两个类,我想在运行时只使用一个类(取决于我是在运行测试还是在服务器上执行应用程序(本地或其他))并从Spring&#39中排除另一个类; s分量扫描。

这是测试时我想要使用的第一个类:

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()方法声明的接口。

我希望在测试时使用DI注入HibernateUtilForH2,并在本地服务器上使用HibernateUtilForMySql进行生产或执行。我该怎么做?

我尝试过使用@TestComponent@ConditionalOnWebApplication,但似乎都没有效果。我需要一个与GitLab的CI / CD设置兼容的解决方案,以便部署顺畅无忧。

1 个答案:

答案 0 :(得分:2)

您可以使用个人资料。

使用@ActiveProfiles("test")注释您的集成测试,以及应该使用@Profile("test")进行集成测试的组件以及不应为@Profile("!test")进行集成测试而加载的组件