我在Tomcat下运行Grails应用程序。由于各种原因,我必须能够动态地更改应用程序上下文。也就是说,我希望能够(在登录时)设置 这个背景。
我知道这可以通过Config.groovy
来实现,但这是静态的,因此在运行时设置。
在登录时,我得到一个参数,它是应用程序的上下文。
如何设置此上下文?
答案 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()
}
}