我将使用一个父上下文创建多个 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、服务、数据源、事务管理器等)。拥有多个上下文的原因是需要拥有多个不同的数据源(实际上每个应用程序上下文一个)。每个数据源的数据库结构都是相同的。
所以,有一些问题。
- 拥有这样的上下文层次结构安全吗?例如,如果有 30 个子上下文?
- 跨子上下文 bean 可见性怎么样?说吧,我有客户服务声明的bean@成分具有多个自动装配 DAO 依赖项的注释。 Spring 是否在特定的子上下文中执行自动装配和其他 DI 操作?
- 另外,我将使用以下方法从子上下文中查找 bean:childContext.getBean(CustomerService.class);我是否从该特定子上下文而不是其他子上下文中获得客户服务?我知道,spring 单例是每个应用程序上下文的单例,但仍不确定。
附言。
还有另一种处理所描述的多个数据源的方法here http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/。但这种方法对于我来说似乎不太方便。
- 拥有这样的上下文层次结构安全吗?例如,如果有 30 个子上下文?
你所说的安全是什么意思?如果您的意思是 bean 初始化时的线程安全,那么是的,因为上下文是一一初始化的。
- 跨子上下文 bean 可见性怎么样?说吧,我有客户服务声明的bean@成分具有多个自动装配 DAO 依赖项的注释。 Spring 是否在特定的子上下文中执行自动装配和其他 DI 操作?
Bean 在子上下文中不可见。上下文中唯一可见的 bean 是它自己的 bean 及其父上下文中的 bean。
- 另外,我将使用以下方法从子上下文中查找 bean:childContext.getBean(CustomerService.class);我是否从该特定子上下文而不是其他子上下文中获得客户服务?我知道,spring 单例是每个应用程序上下文的单例,但仍不确定。
是的。根据最后一个问题的答案。
我在我的应用程序中广泛使用这种模式。许多其他子上下文通过将其作为父上下文来共享公共上下文。当您想要在单个 JVM 中运行完全隔离的上下文时(例如,如果您的应用程序是多租户应用程序),它非常有用。然后,您可以按租户方式启动/停止/重新启动应用程序上下文,而无需重新启动 JVM。
这还允许数据源和事务管理器的明确分离,并允许人们轻松地对数据库进行分片。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)