2009-10-23 93 views
1

我有一個在Tomcat下運行的Grails應用程序。出於各種原因,我必須能夠動態地改變應用程序上下文。也就是說,我希望能夠(在登錄時)在此上下文中設置 。動態設置Grails應用程序上下文嗎?

我知道這是可行的,通過Config.groovy,但這是靜態的,所以在運行時設置。 在登錄時我收到一個參數,它是應用程序的上下文。

如何設置此上下文?

+0

什麼是你需要在運行時更改? – leebutts 2009-10-23 22:41:21

回答

3

通常,您不需要更改每個用戶登錄的應用程序上下文。 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() 
    } 

} 
+0

我真的不明白如何使用你的提示。如果您可以指定更多如何使用您的方法,我真的很感激。 非常感謝。路易斯 – Luixv 2009-10-25 11:30:42

+0

我擴大了我的答案。如果還不清楚,最好是如果你更詳細地描述你所面臨的問題。 – Dan 2009-10-26 13:51:39

相關問題