Java 多次导入相同的spring应用程序上下文文件
我有一个大的网络项目,它被分为多个模块。每个模块都有自己的spring应用程序上下文xml文件。在父项目的applicationContext.xml文件中,我导入了子模块的所有applicationContext.xml文件。假设我有以下子applicationContext.xml文件Java 多次导入相同的spring应用程序上下文文件,java,spring,applicationcontext,Java,Spring,Applicationcontext,我有一个大的网络项目,它被分为多个模块。每个模块都有自己的spring应用程序上下文xml文件。在父项目的applicationContext.xml文件中,我导入了子模块的所有applicationContext.xml文件。假设我有以下子applicationContext.xml文件 -aContext.xml -bContext.xml -cContext.xml 在父项目的applicationContext.xml文件中,所有这些都将被导入。但是我在aCon
-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文件并只导入一次,我会看到任何性能改进吗?这实际上是一个有趣的问题。如果您看这里,有一个公开的请求,要求Spring开发一个功能来缓解这个问题: 如果你仔细阅读这些评论和建议的解决方案,你就能更好地了解实际情况 如果您想知道创建了多少已定义对象的实例,应该进行测试。我建议创建一个对象,在其构造函数中增加一个静态计数器,并在双重导入的spring文件中为它添加一个bean定义。然后,您可以使用双重导入加载配置文件,并查看在加载容器时实际创建了多少已定义bean的实例
这个问题导致了同一份报告。这实际上是一个有趣的问题。如果您看这里,有一个公开的请求,要求Spring开发一个功能来缓解这个问题: 如果你仔细阅读这些评论和建议的解决方案,你就能更好地了解实际情况 如果您想知道创建了多少已定义对象的实例,应该进行测试。我建议创建一个对象,在其构造函数中增加一个静态计数器,并在双重导入的spring文件中为它添加一个bean定义。然后,您可以使用双重导入加载配置文件,并查看在加载容器时实际创建了多少已定义bean的实例
这个问题会导致相同的报告。通常,当加载SpringWeb应用程序上下文时,它会跟踪bean定义,如果稍后在上下文中找到相同的bean定义,则会覆盖。从那里您可以得到“覆盖bean定义”消息,如所述。所以我认为唯一的影响是不必要地创建大量bean定义。然而,在创建和连接bean时,只使用最终的有效bean定义。此外,对于web应用程序上下文,默认情况下会急切地初始化bean,因此此开销通常在服务器启动时的应用程序部署上。因此,从按应用程序提供请求的上下文中的性能角度来看,除了服务器启动时的开销和一些恼人的日志消息之外,这不会产生任何影响。通常,当加载SpringWeb应用程序上下文时,它会跟踪bean定义,并在以后的上下文中找到相同的bean定义时进行重写。从那里您可以得到“覆盖bean定义”消息,如所述。所以我认为唯一的影响是不必要地创建大量bean定义。然而,在创建和连接bean时,只使用最终的有效bean定义。此外,对于web应用程序上下文,默认情况下会急切地初始化bean,因此此开销通常在服务器启动时的应用程序部署上。因此,从应用程序服务请求的性能角度来看,除了服务器启动时的开销和一些恼人的日志消息之外,这没有任何影响。我知道这篇文章很老,但我想发布这个答案,因为在某些情况下,这样的实现除了性能问题外,还可能导致不同的问题。修复后,肯定会有性能改进,但如果不修复,可能会导致web应用程序出现问题。我最近在一个高流量的web应用程序中遇到了这个问题,同一个应用程序上下文文件被多次初始化,导致web应用程序服务器上挂起多个线程 在此应用程序上下文初始化期间,它试图 初始化一些SpringMVC类,然后继续尝试 初始化某些字符集和IBM SDK特定的一个字符集 -“IBM1385”尝试访问ExtendedCharset,然后访问AbstractCharsetProvided.alias,由于多个原因而导致死锁 并发调用。这是一个已知问题,可以找到更多详细信息 这是一个实例,在多线程环境中多次初始化同一应用程序上下文文件(如web应用程序)会导致问题,并导致服务器大量停机。类似地,这种实施可能会有更多的问题,应该避免 另外,我同意@Shailendra,当这个问题得到解决时,它肯定会提高性能,而且在这种情况下,Spring不会实例化同一个类的多个实例,因此我们的应用程序不需要这些实例
希望这能有所帮助。我知道这篇文章已经很老了,但我想发布这个答案,因为在某些情况下,这种实现除了性能问题外,还可能导致不同的问题。修复后,肯定会有性能改进,但如果不修复,可能会导致web应用程序出现问题。我最近在一个高流量的web应用程序中遇到了这个问题,同一个应用程序上下文文件被多次初始化,导致web应用程序服务器上挂起多个线程 在此应用程序上下文初始化期间,我