Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 有没有办法获取JVM中运行的所有Spring应用程序上下文的列表?_Java_Spring_Servlets - Fatal编程技术网

Java 有没有办法获取JVM中运行的所有Spring应用程序上下文的列表?

Java 有没有办法获取JVM中运行的所有Spring应用程序上下文的列表?,java,spring,servlets,Java,Spring,Servlets,我希望能够从运行在servlet容器中的web应用程序中获得所有Spring应用程序上下文的列表。这样我就可以在不重新启动或重新加载容器或webapps的情况下重新初始化上下文 这可能吗?如果是,怎么做?是否仍然可以通过servlet API获取在servlet容器实例上运行的所有servlet上下文的列表?以前有,它被称为[getServlets](;然而,它现在已被弃用,没有替代品,这意味着使用这种方法可能会使实现规范变得过于繁重。从规范的JavaDoc中可以看出: getServlets

我希望能够从运行在servlet容器中的web应用程序中获得所有Spring应用程序上下文的列表。这样我就可以在不重新启动或重新加载容器或webapps的情况下重新初始化上下文


这可能吗?如果是,怎么做?是否仍然可以通过servlet API获取在servlet容器实例上运行的所有servlet上下文的列表?

以前有,它被称为[getServlets](;然而,它现在已被弃用,没有替代品,这意味着使用这种方法可能会使实现规范变得过于繁重。从规范的JavaDoc中可以看出:

getServlets

public java.util.Enumeration getServlets()

已弃用。自JavaServletAPI2.0起,无需替换

此方法最初定义为返回 此servlet已知的所有servlet 在这个版本中,这个方法 始终返回空枚举 并且只保留二进制文件 兼容性。此方法将 在将来被永久移除 JavaServletAPI的版本


您的容器可能会实现类似的方法,但它将是非标准的,您必须深入了解它的文档,或者告诉我们您使用的是哪个容器。

否-这两个问题

访问所有servlet上下文将是一个安全问题。您可以检查和/或操作其他Web应用程序。唯一知道所有servlet上下文的是容器本身。但这是内部实现,没有api


Spring上下文访问类似,但如果您指的是一个webapp中的所有Spring上下文,那么它们将创建一个层次结构,例如控制器的层次结构。在根Spring上下文中实现
org.springframework.context.ApplicationListener
作为bean(由
web.xml
中配置的
org.springframework.web.context.ContextLoaderListener
初始化)可以通知您上下文已启动、停止、关闭或刷新。

[编辑:这并没有真正的帮助,因为每个web.xml都必须具有相同的侦听器]

您可以监听标准属性的插入,然后通知某个集中式监视器

未测试:

public class SpringWACListener implements ServletContextAttributeListener {
    public void attributeAdded(ServletContextAttributeEvent scab) {
        if (WebApplicationContext.
            ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE.
            equals(scab.getName()) {
            myCentralisedMonitor.notify("added");
        }
    }
    // same for others
}

您可以尝试Spring应用程序管理套件


虽然不确定所涉及的成本是多少,但无法想象它是便宜的。

Tomcat中的manager web应用程序使用定制的Catalina API列出并控制其他web应用程序/servlet上下文。我假设其他应用程序可以使用此API来类似地规避安全性,但我想要一个不使用Catalina API的解决方案。Y你不能使用catalina API来实现其他应用服务器(如websphere、trifork、oracle或jetty)使用的Web应用程序。感谢你的提示,应该可以在我的所有Web应用程序中包含相同的侦听器。你为什么要这样做?可能还有其他解决方案……经过一番思考,我终于意识到我很瘦我想做的是在不重新启动应用程序的情况下修改一些外部配置并重新加载我的全部或部分Spring Bean。相反,我将以JMX Bean的形式公开我的应用程序上下文。