Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring load app context в зависимости от Profile


Автор: 4epT 25.6.2013, 18:46
Всем привет. Имеется большой проект, который состоит из модулей. Один из модулей это data-layer, то есть модуль для работы с БД. Сейчас пишу юнит тесты под данный модуль. Нашел очень красивое решение с помощью которого можно очень легко подпихивать тестовый контекст для тестов. Вот пример:

Код

public final class ApplicationProfiles {

    public static final String DEVELOPMENT = "development";

    public static final String TEST = "test";

    public static final String PRODUCTION = "production";

    private ApplicationProfiles() {
    }

}


Код

@Configuration
public class ApplicationConfig {

    @Configuration
    @Profile( ApplicationProfiles.DEVELOPMENT )
    @ImportResource(value = { "classpath:application-config.xml" })
    static class DevelopmentEnvironmentConfiguration {

    }

    @Configuration
    @Profile( ApplicationProfiles.TEST )
    @ImportResource(value = { "classpath:application-test-config.xml" })
    static class TestEnvironmentConfiguration {

    }

    @Configuration
    @Profile( ApplicationProfiles.PRODUCTION )
    @ImportResource(value = { "classpath:application-config.xml" })
    static class ProductionEnvironmentConfiguration {

    }

}


Код

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ApplicationConfig.class }, loader = AnnotationConfigContextLoader.class)
@ActiveProfiles( profiles = {ApplicationProfiles.TEST} )
public class MyTest {
...
}


И теперь встал вопрос, как сделать в таком же виде загрузку "боевого" контекста и инициализацию какого нибудь static поля этим контекстом ?

дело в том что у меня нет как такового main метода, это просто модуль ) Есть пару фабрик для получения нужных DAO классов и все.

Можно было бы сделать как то так:

Код

private SpringContext() {
        try {
            context = new ClassPathXmlApplicationContext("application-config.xml");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


Но тогда теряется весь смысл профилей. В идеале я это вижу вот так:

Код

@ContextConfiguration( classes = ApplicationConfig.class, loader = AnnotationConfigContextLoader.class)
@ActiveProfiles(profiles = {ApplicationProfiles.PRODUCTION})
public class SpringContext implements ApplicationContextAware{
...
@Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext; // set static context 
    }
}


Но в таком случае SpringContext должен быть бином и его кто то должен создать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)