gpt4 book ai didi

Spring上下文层次结构

转载 作者:行者123 更新时间:2023-12-04 06:21:46 25 4
gpt4 key购买 nike

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

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

    最佳答案

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

  • 你说的安全是什么意思?如果您的意思是 bean 初始化时的线程安全,那么可以,因为上下文是一一初始化的。
  • 跨子上下文 bean 可见性怎么样?比如说,我使用 @Component 注释声明了 CustomerService bean,并带有几个 Autowiring 的 DAO 依赖项。 Spring 是否在特定子上下文中执行 Autowiring 和其他 DI 操作?

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

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

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

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

    关于Spring上下文层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14315314/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com