OSGi 環境で実行されている (つまり、OSGi HttpServiceに登録されている) HttpServlet が、そのタスクを実行するためにいくつかの OSGi サービスを呼び出したいと思うのは当然のことです。問題は、サーブレット内でこれらの OSGi サービスへの参照を取得する方法です。
1 つの方法は、次のように OSGi HttpService に登録されている HttpServlet インスタンスに依存関係を注入することです。
MyServlet servlet = new MyServlet();
servlet.setFooService(fooService);
httpService.registerServlet("/myservlet", servlet, initparams, context);
OSGi 以外の環境では、サーブレットのライフサイクルが Web コンテナーによって管理され、後で作成されるサーブレット インスタンスにサービス参照が挿入されないため、これが有効なアプローチであるかどうかはわかりません。
OSGi HttpService の実装としてPAX Webを使用する場合、これを解決する別の方法があります。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 の具体的な実装に結び付けられます。この問題に対する他の (そしておそらくより良い) 解決策を知っていますか?