我希望能够从我的servlet容器中运行的Web应用程序中获取所有Spring应用程序上下文的列表。这样我就可以在不重新启动或重新加载容器或webapps的情况下重新初始化上下文。
这可能吗?如果是这样,怎么样?无论如何通过Servlet API获取在servlet容器实例上运行的所有servlet上下文的列表?
答案 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的版本。
您的容器可能会采用类似的方法,但它是非标准的,您必须深入了解它的文档或告诉我们您正在使用哪个容器。