2013-01-14 100 views
7

我將用一個父上下文創建多個Spring上下文。 這裏是我要如何創建父上下文:Spring上下文層次結構

new ClassPathXmlApplicationContext(new String[] {"ApplicationContext/application.xml"}) 

而且每個家長方面,我想在下面的方法來創建:

PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
configurer.setProperties(properties); 
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(appContext); 
context.addBeanFactoryPostProcessor(configurer); 
context.setConfigLocation("ApplicationContext/beans.xml"); 
context.refresh(); 

的想法是有相同的多個子上下文每個bean中的bean層次結構(DAO,服務,數據源,事務管理器等)。有幾個上下文的原因是需要有幾個不同的數據源(實際上每個應用程序上下文一個)。每個數據源的數據庫結構都是相同的。 所以,有一些問題。

  1. 這樣的上下文層次結構安全嗎?例如,如果有30個子上下文?
  2. 跨孩子上下文bean可見性呢?說,我有CustomerService bean聲明@Component註釋與幾個自動裝配的DAO依賴項。 Spring會在特定的子環境中執行自動裝配和其他DI操作嗎?
  3. 此外,我將使用以下方法從子上下文中查找bean: childContext.getBean(CustomerService.class);我是否從這個特定的子上下文獲得客戶服務,而不是其他子上下文?我知道,那個春天的單身人士是每個應用程序的單身人士,但仍然不確定。

PS。 還有另一種方法來處理here所描述的多個數據源。但是這種方法對我來說似乎並不方便。

+0

我注意到你的用例和我的完全一樣。 –

回答

11
  • 上下文的層次結構是否安全?例如,如果有30個子上下文?

你的意思是安全嗎?如果你的意思是在bean初始化時線程安全,那麼是的,因爲上下文是一個接一個地初始化的。

  • 跨子上下文bean可見性呢?說,我有CustomerService bean聲明@Component註釋與幾個自動裝配的DAO依賴項。 Spring會在特定的子環境中執行自動裝配和其他DI操作嗎?

Bean在子上下文中不可見。在一個上下文中唯一可見的bean是它自己的,並且在它的父上下文中。

  • 另外,我要查找使用下面的方法從孩子方面豆類: childContext.getBean(CustomerService.class);我是否從這個特定的子上下文獲得客戶服務,而不是其他子上下文?我知道,那個春天的單身人士是每個應用程序的單身人士,但仍然不確定。

是的。根據最後一個問題的答案。

我在我的應用程序中廣泛使用這種模式。有許多其他的子上下文通過將它們作爲它們的父項共享上下文。當您想要在單個JVM中運行完全獨立的上下文時(例如,如果您的應用程序是多租戶應用程序),它非常有用。然後,您可以在不重新啓動JVM的情況下啓動/停止/重新啓動應用程序上下文。

這也允許數據源和事務管理器的清晰分離,並允許人們輕鬆地分割他們的數據庫。

+0

感謝您的回答。多租戶架構正是我的例子。我只是不確定使用描述的模式來爲我的應用帶來春天。通過「安全」,我的意思是創建大量的春季環境是一種很好的做法。正如你所說,你正在使用這種模式相當廣泛,所以它似乎是好的。 – alsid

+0

我正在尋找Spring的父/子上下文用例。您是否知道其他用例而不是多租戶架構?你在過去的2年中修改了你的解決方案嗎? – michaldo