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

时间:2009-02-16 14:58:15

标签: java spring servlets

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

这可能吗?如果是这样,怎么样?无论如何通过Servlet API获取在servlet容器实例上运行的所有servlet上下文的列表?

4 个答案:

答案 0 :(得分:3)

不 - 两个问题。

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

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

答案 1 :(得分:2)

[编辑:这没有用,因为每个web.xml都必须有相同的监听器]

您可以ServletContextAttributeListener收听标准WebApplicationContext 属性的插入,然后通知某个集中监控器吗?

未经测试:

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
}

答案 2 :(得分:1)

您可以尝试使用Spring Application Management Suite

http://www.springsource.com/products/ams

不确定所涉及的费用是多少,但不能想象它便宜。

答案 3 :(得分:0)

曾经有过它被称为[getServlets](http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String));但是,它现在已被弃用,没有替换意味着拥有这样的方法可能使得实现规范过于繁琐。来自规范的JavaDoc :

  

getServlets

     

public java.util.Enumeration getServlets()

     

已过时。从Java Servlet API 2.0开始,没有替换。

     

此方法最初定义为返回Enumeration   这个servlet已知的所有servlet   上下文。在这个版本中,这个方法   始终返回空枚举   并保持只保留二进制   兼容性。这个方法会   将来永久删除   Java Servlet API的版本。

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