多次导入相同的spring应用程序上下文文件

时间:2014-03-09 19:06:27

标签: java spring applicationcontext

我有一个跨多个模块的大型Web项目。每个模块都有自己的spring应用程序上下文xml文件。在父项目的applicationContext.xml文件中,我导入了所有子模块的applicationContext.xml文件。假设我有以下子applicationContext.xml文件

    -aContext.xml
    -bContext.xml
    -cContext.xml

在父项目的applicationContext.xml文件中,正在导入所有这些文件。但是我在aContext.xml bContext.xml和cContext.xml中看到的一些地方又被重新导入了?

层次结构是这样的 -

     -applicationContext.xml(parent)
         -aContext.xml
             -bContext.xml
             -cContext.xml
         -bContext.xml
         -cContext.xml

我可以理解,因为我的Web应用程序运行正常,所以没有任何伤害。我唯一能理解的是,这样做是否有任何性能故障?如果我删除嵌套的xml文件并仅导入一次,我会看到任何性能改进吗?

3 个答案:

答案 0 :(得分:3)

实际上,这是一个有趣的问题。如果你看这里,就会有一个开放的请求让Spring开发一个功能来缓解这个问题:https://jira.spring.io/browse/SPR-1142

如果你仔细阅读了这些以及评论/建议的解决方案,你就可以更好地了解实际情况。

如果您想知道创建了多少个已定义对象的实例,则应该进行测试。我建议创建一个对象,在其构造函数中递增静态计数器,并在双重导入的spring文件中为它添加bean定义。然后,您可以使用double import加载配置文件,并查看容器加载时实际创建了多少个已定义bean的实例。

此问题会导致同一报告Ability to avoid loading the same spring file multiple times

答案 1 :(得分:3)

通常在加载spring Web应用程序上下文时,如果它在上下文中找到相同的bean定义,它将跟踪bean定义和覆盖。从那里你得到“Overriding bean definition”消息,如here所述。所以我认为唯一的影响是不必要地创建大量的bean定义。但是,在创建和连接bean时,只使用最终的有效bean定义。此外,对于Web应用程序上下文,默认情况下会急切地初始化bean,因此这种开销通常是在服务器启动时的应用程序部署上。因此,从应用程序提供请求的上下文中的性能角度来看,除了服务器启动时的开销和一些烦人的日志消息之外,这没有其他影响。

答案 2 :(得分:0)

我知道这篇文章已经很老了,但我发布了这个答案,因为有些情况下这种实现除了性能之外还会导致不同的问题。修复后,肯定会有性能改进,但如果不修复,可能会导致Web应用程序出现问题。我最近在高流量Web应用程序中遇到此问题,其中相同的应用程序上下文文件多次初始化并导致Web应用程序服务器上挂起多个线程。

  

在此应用程序上下文初始化期间,它正在尝试   初始化一些Spring MVC类,这些类进一步尝试了   初始化一些charset和一个特定于IBM SDK的charset    - ' IBM1385'试图访问ExtendedCharsets,然后是AbstractCharsetProvided.aliases,因为多个而导致死锁   并发呼叫。这是一个已知问题,可以找到更多细节   here

这是在多线程环境(如Web应用程序)中多次初始化相同应用程序上下文文件导致问题并导致服务器停机时间过长的一个实例。同样,这种实施可能会有更多问题,应该避免。

另外,我同意@Shailendra answer,当这个问题得到修复时,它肯定会提高性能,在这种情况下,Spring也不会实例化同一类的多个实例,而这些实例并不是必需的。我们的申请。

希望有所帮助。