2013-01-14 68 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