Spring上下文层次结构

时间:2013-01-14 08:46:29

标签: spring applicationcontext

我将使用一个父上下文创建几个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); 我是从这个特定子上下文而不是其他子上下文获取客户服务吗?我知道,Spring spring是每个应用程序上下文的单例,但仍然不确定。
  4. PS。 还有另一种处理描述here的数据源的方法。但在我看来,这种做法似乎并不方便。

1 个答案:

答案 0 :(得分:11)

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

你的安全意味着什么?如果您在bean初始化时表示线程安全,那么是,因为上下文是逐个初始化的。

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

在子环境中看不到豆类。在上下文中可见的唯一bean是它自己的,以及它在父上下文中的bean。

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

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

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

这样还可以清楚地分离数据源和事务管理器,并允许用户轻松地对其数据库进行分片。