Как правило, вам не нужно менять контекст приложения при каждом входе пользователя в систему. Spring Context содержит объекты, которые обычно живут столько же времени, сколько приложение, и, как правило, не зависят от пользователя. Возможно, вы хотите расширить свой вопрос и объяснить свой сценарий, поскольку, исходя из того, что вы уже сказали, не похоже, что вы на правильном пути.
В одном приложении у нас был другой источник данных в зависимости от предприятия, к которому принадлежал пользователь. Несмотря на это, контекст не был затронут, только пользовательский сеанс и небольшое вмешательство с фильтром OpenSessionInView.
Если по какой-либо причине вам необходимо программно вмешаться в Spring ApplicationContext, вы можете сделать это, овладев контекстом посредством интерфейса ApplicationContextAware. Затем вы можете манипулировать контекстом, например, добавлять новые определения bean-компонентов, контексты цепочки (см. setParent ) и т. Д.
Вы можете использовать BeanDefinitionBuilder для создания вашего бина и затем вызвать
Метод registerBean для GenericApplicationContext .
Вы можете получить ApplicationContext, сделав свой сервис, например, ApplicationContextAware. Затем вы можете вызвать метод registerBean из вашего контроллера. Посмотрите на этот код:
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.factory.support.BeanDefinitionBuilder
class MyRedefiningService implements ApplicationContextAware {
def context
void setApplicationContext(ApplicationContext context) {
this.context = context
}
void registerBean(){
BeanDefinitionBuilder builderA = BeanDefinitionBuilder
.rootBeanDefinition(DummyService.class)
context.registerBeanDefinition("bean-a", builderA.getBeanDefinition());
println context.getBean("bean-a");
}
}
//controller class
class SomeController {
def myRedefining
def index = {
myRedefining.registerBean()
}
}