Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次导入相同的spring应用程序上下文文件_Java_Spring_Applicationcontext - Fatal编程技术网

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

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

我有一个大的网络项目,它被分为多个模块。每个模块都有自己的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文件并只导入一次,我会看到任何性能改进吗?

这实际上是一个有趣的问题。如果您看这里,有一个公开的请求,要求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应用程序服务器上挂起多个线程

在此应用程序上下文初始化期间,我