在 OSGi 环境中运行的 HttpServlet(即在 OSGi HttpService中注册)会想要调用一些 OSGi 服务来完成它的任务似乎很自然。问题是如何在 servlet 中获取对这些 OSGi 服务的引用。
一种方法是将依赖项注入到注册到 OSGi HttpService 的 HttpServlet 实例中,如下所示:
MyServlet servlet = new MyServlet();
servlet.setFooService(fooService);
httpService.registerServlet("/myservlet", servlet, initparams, context);
我不确定这是否是一种有效的方法,因为在非 OSGi 环境中,servlet 生命周期由 Web 容器管理,因此不会为稍后创建的 servlet 实例注入服务引用。
当使用PAX Web作为 OSGi HttpService 的实现时,还有另一种方法可以解决这个问题。PAX Web 将 OSGi BundleContext 作为特殊属性“osgi-bundlecontext”导出到 ServletContext。然后可以使用 BundleContext 来获取必要的服务引用:
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext context = servletConfig.getServletContext()
BundleContext bundleContext =
(BundleContext) context.getAttribute("osgi-bundlecontext");
ServiceReference serviceRef =
bundleContext.getServiceReference("com.foo.FooService")
}
然而,这种方法相当丑陋,并将您与 OSGi HttpService 的具体实现联系在一起。你知道这个问题的任何其他(可能更好的)解决方案吗?