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();

这个想法是在每个上下文(dao、服务、数据源、事务管理器等)中具有相同bean层次结构的多个子上下文。使用多个上下文的原因是需要多个不同的数据源(实际上每个应用程序上下文一个)。每个数据源的数据库结构是相同的。所以,这里有一些问题。

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

p。还有另一种方法可以处理这里描述的多个数据源。但是对于我来说,这种方法似乎不是很方便。

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

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

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

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

  • 此外,我将使用以下方法从子上下文查找bean:我是从这个特定的子上下文而不是从其他子上下文获得客户服务吗?我知道,spring单例是每个应用上下文的单例,但仍然不确定。

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

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

这也允许数据源和事务管理器的清晰分离,并允许人们轻松地分片他们的数据库。

最新更新