8

我将使用一个父上下文创建多个 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 层次结构的子上下文(DAO、服务、数据源、事务管理器等)。拥有多个上下文的原因是需要拥有多个不同的数据源(实际上每个应用程序上下文一个)。每个数据源的数据库结构都是相同的。所以,有一些问题。

  1. 拥有这样的上下文层次结构是否安全?例如,如果有 30 个子上下文?
  2. 跨子上下文 bean 可见性怎么样?比如说,我使用@Component注释声明了CustomerService bean,并带有几个自动装配的 DAO 依赖项。Spring 是否在特定子上下文中执行自动装配和其他 DI 操作?
  3. 另外,我将使用以下方法从子上下文中查找 bean: childContext.getBean(CustomerService.class); 我是否从这个特定的子上下文而不是其他子上下文中获得客户服务?我知道,弹簧单例是每个应用程序上下文的单例,但仍然不确定。

PS。还有另一种方法来处理此处描述的多个数据源。但就我而言,这种方法似乎不太方便。

4

1 回答 1

13
  • 拥有这样的上下文层次结构是否安全?例如,如果有 30 个子上下文?

你说的安全是什么意思?如果您的意思是 bean 初始化时的线程安全,那么可以,因为上下文是一一初始化的。

  • 跨子上下文 bean 可见性怎么样?比如说,我使用@Component注释声明了CustomerService bean,并带有几个自动装配的 DAO 依赖项。Spring 是否在特定子上下文中执行自动装配和其他 DI 操作?

Bean 在子上下文中不可见。在上下文中唯一可见的 bean 是它自己的和在其父上下文中的。

  • 另外,我将使用以下方法从子上下文中查找 bean: childContext.getBean(CustomerService.class); 我是否从这个特定的子上下文而不是其他子上下文中获得客户服务?我知道,弹簧单例是每个应用程序上下文的单例,但仍然不确定。

是的。根据最后一个问题的答案。

我在我的应用程序中广泛使用了这种模式。许多其他子上下文通过将其设为父上下文来共享公共上下文。当您想在单个 JVM 中运行完全隔离的上下文时,它非常有用,例如,如果您的应用程序是多租户的。然后,您可以按租户方式启动/停止/重新启动应用程序上下文,而无需重新启动 JVM。

This also allows a clear separation of data sources and transaction managers and allows one to shard their databases easily.

于 2013-01-14T09:24:59.350 回答