动态设置Grails应用程序上下文?

时间:2009-10-23 15:47:58

标签: grails configuration groovy

我在Tomcat下运行Grails应用程序。由于各种原因,我必须能够动态地更改应用程序上下文。也就是说,我希望能够(在登录时)设置 这个背景。

我知道这可以通过Config.groovy来实现,但这是静态的,因此在运行时设置。 在登录时,我得到一个参数,它是应用程序的上下文。

如何设置此上下文?

1 个答案:

答案 0 :(得分:3)

通常,您不需要在每次用户登录时更改应用程序上下文。 Spring Context包含的对象通常与应用程序一样长,并且通常与用户无关。也许您希望扩展您的问题并解释您的情况,因为根据您所说的内容,您似乎并没有走上正确的轨道。

在一个应用程序中,我们根据用户所属的企业拥有不同的数据源。甚至比上下文没有受到影响,只有用户会话和一些干扰OpenSessionInView过滤器。

如果出于某种原因需要以编程方式干预Spring ApplicationContext,可以通过ApplicationContextAware接口获取Context来实现。然后你可以操纵上下文,例如添加新的bean定义,链上下文(参见setParent)等。

您可以使用BeanDefinitionBuilder构建您的bean,然后调用 GenericApplicationContext上的registerBean方法。

您可以通过提供服务(例如ApplicationContextAware)来获取ApplicationContext。然后,您可以从控制器调用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()
   }

}