我有一个在 Tomcat 下运行的 Grails 应用程序。由于各种原因,我必须能够动态更改应用程序上下文。也就是说,我希望能够(在登录时)设置
这个上下文。
我知道这可以通过 Config.groovy
,但这是静态的,因此在运行时设置。
在登录时,我得到一个参数,它是应用程序的上下文。
如何设置此上下文?
最佳答案
通常,您不需要在每次用户登录时更改应用程序上下文。 Spring Context 包含的对象通常与应用程序一样长,并且通常不依赖于用户。也许您希望扩展您的问题并解释您的情况,因为根据您到目前为止所说的内容,您似乎没有走在正确的轨道上。
在一个应用程序中,我们有不同的数据源,具体取决于用户所属的企业。即使这样,上下文也没有受到影响,只有用户 session 和一些干预 OpenSessionInView 过滤器。
如果出于某种原因,您需要以编程方式干预 Spring ApplicationContext,您可以通过 ApplicationContextAware 接口(interface)获取 Context 来实现。然后您可以操作上下文,例如添加新的 bean 定义、链上下文(参见 setParent)等。
您可以使用BeanDefinitionBuilder构造你的bean,然后调用
GenericApplicationContext 上的 registerBean 方法.
您可以通过使您的服务获得 ApplicationContext,例如 ApplicationContextAware。然后你可以从你的 Controller 调用 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()
}
}
关于grails - 动态设置 Grails 应用程序上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614335/