我有一個在Tomcat下運行的Grails應用程序。出於各種原因,我必須能夠動態地改變應用程序上下文。也就是說,我希望能夠(在登錄時)在此上下文中設置 。動態設置Grails應用程序上下文嗎?
我知道這是可行的,通過Config.groovy
,但這是靜態的,所以在運行時設置。 在登錄時我收到一個參數,它是應用程序的上下文。
如何設置此上下文?
我有一個在Tomcat下運行的Grails應用程序。出於各種原因,我必須能夠動態地改變應用程序上下文。也就是說,我希望能夠(在登錄時)在此上下文中設置 。動態設置Grails應用程序上下文嗎?
我知道這是可行的,通過Config.groovy
,但這是靜態的,所以在運行時設置。 在登錄時我收到一個參數,它是應用程序的上下文。
如何設置此上下文?
通常,您不需要更改每個用戶登錄的應用程序上下文。 Spring上下文包含的對象通常與應用程序一樣存在,並且通常不依賴於用戶。也許你想擴大你的問題,並解釋你的情況,因爲根據你所說的話到目前爲止,你似乎並沒有走上正軌。
在一個應用程序中,根據用戶所屬企業的不同,我們有不同的數據源。即使如此,上下文也沒有受到影響,只有用戶會話和一些干擾OpenSessionInView過濾器。
如果無論出於何種原因需要以編程方式介入Spring ApplicationContext,可以通過ApplicationContextAware接口獲取Context來完成。然後,你可以操縱的情況下,例如增加新的bean定義,鏈上下文(見setParent)等
您可以使用BeanDefinitionBuilder來構建你的bean,然後調用 registerBean方法上GenericApplicationContext。
您可以通過使您的服務例如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()
}
}
什麼是你需要在運行時更改? – leebutts 2009-10-23 22:41:21