Установить контекст приложения Grails динамически? - PullRequest
1 голос
/ 23 октября 2009

У меня есть приложение Grails, работающее под Tomcat. По разным причинам я должен иметь возможность динамически изменять контекст приложения. То есть я хочу иметь возможность (во время входа в систему) установить этот контекст.

Я знаю, что это выполнимо через Config.groovy, но это статично и поэтому устанавливается во время выполнения. Во время входа в систему я получаю параметр, который является контекстом для приложения.

Как мне установить этот контекст?

1 Ответ

3 голосов
/ 23 октября 2009

Как правило, вам не нужно менять контекст приложения при каждом входе пользователя в систему. 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()
   }

}
...