Как установить активный профиль при программном создании контекста Spring?

tl;dr: как создать контекст Spring на основе класса конфигурации на основе аннотаций, предоставляя при этом активные профили?

Я пытаюсь создать контекст Spring, используя класс с конфигурацией, указанной с помощью аннотаций.

org.springframework.context.ApplicationContext context = 
    new org.springframework.context.annotation.AnnotationConfigApplicationContext( com.initech.ReleaserConfig.class );

Однако, когда он запускается, он падает, потому что не может найти требуемый компонент, но этот компонент существует: хотя и только под определенным профилем "myProfile".

Как указать активный профиль? У меня есть ощущение, что мне нужно использовать один из конструкторов org.springframework.context.annotation.AnnotationConfigApplicationContext(org.springframework.beans.factory.support.DefaultListableBeanFactory), но я не уверен, какие из них подходят.


PS- Я не использую Spring Boot, но использую Spring 4.2.4.RELEASE.


person Sled    schedule 26.10.2016    source источник


Ответы (2)


Это должно сработать...

final AnnotationConfigApplicationContext appContext =  new AnnotationConfigApplicationContext();
appContext.getEnvironment().setActiveProfiles( "myProfile" );
appContext.register( com.initech.ReleaserConfig.class );
appContext.refresh();
person Jamie Bisotti    schedule 26.10.2016
comment
Это не сработает, поскольку создание экземпляра контекста приложения вызывает исключение, поэтому я никогда не смогу перейти к вызову .getEnvironment(). - person Sled; 26.10.2016
comment
ваш ответ привел к решению, поэтому я завершил его, чтобы он работал - person Sled; 26.10.2016
comment
@ArtB вы можете использовать System.setProperty("spring.profiles.active", "myProfile"); перед созданием контекста - person xedo; 26.06.2017
comment
Привет @ArtB Как ты решил эту проблему? не могли бы вы поделиться дополнительной информацией? Я также застрял в той же проблеме, найдите мой вопрос здесь stackoverflow.com/questions/46422271/ - person Amit; 29.09.2017
comment
Принятый ответ решил мою проблему, и я даже отредактировал, включив недостающие детали, которые мне нужны. - person Sled; 29.09.2017

Если вы хотите, чтобы classpath:resources/application-${spring.profiles.active}.yml работал, установите системные свойства перед обновлением.

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.getEnvironment().getSystemProperties().put(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
applicationContext.scan("com.sample");
applicationContext.refresh();
person RajVimalC    schedule 01.06.2020