我使用Tomcat作为应用程序服务器,并在其上运行4个Web应用程序。由于Web应用程序的一些常见要求,我开发了一个库,该库放在Tomcat的lib
文件夹中,用于共享Web应用程序的实现。但是,我想在库上实现一些资源管理功能,例如为每个Web应用程序创建和管理单例资源(即,一个Web应用程序获取一个单例资源)。我想这样做是为了管理ConcurrentHashMap
并将每个单例资源存储在其中。但是,当Web应用程序调用库来访问其资源时,我需要获取调用者所属的Web应用程序的名称,以便我可以将正确的资源返回给调用者。有没有一种很好的方法来实现这样的事情(应用程序在调用库来获取资源时不需要传递参数或标识的方式)?或者这只是一种错误的思考方式,还有更好的解决方案吗?
非常感谢!
答案 0 :(得分:1)
恕我直言,您所描述的不是 java singleton 模式,因为您需要每个Web应用程序一个对象。事实上,我认为你需要每ServletContext
个对象中的一个。我无法理解为什么你不想使用Servlet功能,因为正确的方法是在每个创建单例资源的web应用程序(它可以是同一个类)中使用ServletContextListener(也可以是公共类)并将它们作为属性放在ServletContext中(每个Web应用程序只有一个)。
ServletContext属性可以从任何servlet(request.getSession().getServletContext().getAttribute("attribute_name")
或jsp(<jsp:useBean id="attribute_name" scope="application" type="..."/>
然后${attribute_name}
)