Java 如何从非组件类使用OSGI服务

Java 如何从非组件类使用OSGI服务,java,servlets,service,osgi,aem,Java,Servlets,Service,Osgi,Aem,我有一个在请求过程中创建的对象,我希望该对象调用服务。然而,当框架调用bind方法时,它绑定到它自己的类实例,而不是我想要绑定到的实例 public class A { final X x; final Y y; public A(Z z) { this.x = z.x; this.y = z.y; } public String doStuff() { //do stuff //call a se

我有一个在请求过程中创建的对象,我希望该对象调用服务。然而,当框架调用bind方法时,它绑定到它自己的类实例,而不是我想要绑定到的实例

public class A {
   final X x;
   final Y y;

   public A(Z z) {
        this.x = z.x;
        this.y = z.y;
   }

   public String doStuff() {
        //do stuff
        //call a service
   }
}

public class B extends RestAPIServlet {

    public String method(@SlingRequest SlingHttpServletRequest request, @SlingResponse SlingHttpServletResponse response) {
        Z z = new ObjectMapper().readValue(request.getReader(), Z.class);
        return new A(z).doStuff();
    }
}

public class C extends TagSupport {

    public int doStartTag() {
        Z z = getZFromProperties();
        String res = new A(z).doStuff();
        pageContext.setAttribute("res", res);
        return super.doStartTag();
    }
}
有什么方法可以直接从服务器调用服务吗?在标记和servlet执行相同工作的情况下,是否有代码重用的首选模式


我被要求不要让tag/servlet实现一个公共接口来提供服务,也不要使用供应商来提供通过tag/servlet访问服务的权限

BundleContext
可以使用
FrameworkUtil
帮助程序类进行检索,而该类又可以用于访问您想要使用的服务。以下是一个例子:

BundleContext bundleContext = FrameworkUtil.getBundle(A.class).getBundleContext();
ServiceReference serviceRef = bundleContext.getServiceReference(MyService.class.getName());
MyService myService = (MyService) bundleContext.getService(serviceRef);

这里有一点警告:这种方法可能会产生奇怪的涟漪效应,导致依赖组件无法正确激活,因为SCR没有注释来知道应该以什么顺序激活。最好是交一份推荐信。