我希望能够从运行在我的servlet容器中的web应用程序获取所有Spring应用程序上下文的列表。这样我就可以重新初始化上下文而无需重新启动或重新加载我的容器或Web应用程序。有没有办法获得在JVM中运行的所有Spring应用程序上下文的列表?
这可能吗?如果是这样,怎么样?无论如何,通过Servlet API获取在servlet容器实例上运行的所有Servlet上下文的列表?
我希望能够从运行在我的servlet容器中的web应用程序获取所有Spring应用程序上下文的列表。这样我就可以重新初始化上下文而无需重新启动或重新加载我的容器或Web应用程序。有没有办法获得在JVM中运行的所有Spring应用程序上下文的列表?
这可能吗?如果是这样,怎么样?无论如何,通过Servlet API获取在servlet容器实例上运行的所有Servlet上下文的列表?
[编辑:这并不能真正帮助,因为每个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
}
过去有,它被称为[getServlets](http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String));然而,现在已被弃用与无替代意味着具有这样的方法可能是由实施该规范过多负担从规范的的JavaDoc:
getServlets
公共的java.util.Enumeration getServlets()
已过时。的Java Servlet API 2.0的,没有更换。
此方法最初被定义为返回一个枚举 所有servlet已知的此servlet 上下文。在此版本中,此方法 始终返回一个空枚举 ,并且仅保留二进制 兼容性。该方法将在 版本的Java Servlet API中永久移除 。
你的容器可能实现了一个类似的方法,但它会是非标准的,你将不得不挖掘它的文档或告诉我们你正在使用哪个容器。
否 - 这两个问题。
访问所有的servlet上下文将是一个安全问题。您将能够检查和/或操纵其他webapps。知道所有servlet上下文的唯一一个是容器本身。但这是内部实现,没有API。
Spring上下文访问是相似的,但如果您指的是一个Web应用程序中的所有spring上下文,它们将创建一个层次结构 - 例如控制器的层次结构。在根弹簧上下文中实现org.springframework.context.ApplicationListener
作为bean(由在web.xml
中配置的org.springframework.web.context.ContextLoaderListener
初始化)可以通知您已启动,停止,关闭或刷新的上下文。
Tomcat中的管理器Web应用程序使用自定义的Catalina API列出并控制其他Web应用程序/ Servlet上下文。我假设其他应用程序可以使用此API来规避安全性,但我想要一个不使用catalina API的解决方案。 – 2009-02-16 16:13:57
你为什么要这么做?也许有其他解决方案可能... – 2009-02-16 16:37:32
经过一番思考后,才意识到我正在考虑这个错误的方式。我想要做的是能够修改一些外部配置,并重新加载全部或部分Spring bean,而无需重新启动我的应用程序。相反,我要将我的应用程序上下文作为JMX bean公开。 – 2009-02-22 12:43:49