【问题标题】:Spring contexts hierarchySpring上下文层次结构
【发布时间】:2012-12-28 05:28:29
【问题描述】:

我将使用一个父上下文创建多个 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 可见性如何?比如说,我有 CustomerService bean 声明了带有几个自动装配的 DAO 依赖项的 @Component 注释。 Spring 是否在特定子上下文中执行自动装配和其他 DI 操作?
  3. 另外,我将使用以下方法从子上下文中查找 bean: childContext.getBean(CustomerService.class); 我是否从这个特定的子上下文而不是其他子上下文获取客户服务?我知道,spring 单例是每个应用程序上下文的单例,但仍然不确定。

PS。 here 描述了另一种处理多个数据源的方法。但在我的情况下,这种方法似乎不太方便。

【问题讨论】:

  • 我注意到你的用例和我的完全一样。

标签: spring applicationcontext


【解决方案1】:
  • 拥有这样的上下文层次结构是否安全?例如,如果有 30 个子上下文?

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

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

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

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

是的。根据上一个问题的答案。

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

这还允许数据源和事务管理器明确分离,并允许人们轻松地对他们的数据库进行分片。

【讨论】:

  • 感谢您的回答。多租户架构正是我的情况。我只是不确定是否使用描述的模式为我的应用程序带来春天。我所说的“安全”是指创建大量弹簧上下文的好习惯。正如你所说,你正在广泛使用这种模式,所以它似乎没问题。
  • 我正在搜索 Spring 父/子上下文用例。除了多租户架构,您还知道其他用例吗?您在过去 2 年中是否修改过您的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2012-12-21
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多