0

我已经使用依赖框架 Guice 构建了一个应用程序。现在我将转到 OSGI 并开始使用捆绑信息扩展我的 jar。

我目前面临的主要问题是如何正确设置依赖注入。我有捆绑 A,它导出一些包。然后 Bundle B 定义了一个组件,该组件需要注入 bundle A 的一些对象(AA 类)。

我可以为包 A 中的 AA 类设置一个服务,该服务将自动注入,但如果包 A 还依赖于包 A 中的某个类,可能没有导出。我是否必须将第二类设置为服务,这将不起作用,因为它没有导出。

以下代码将显示问题:

捆绑包 A

package test.bundleA.api

public class AA {

   @Inject
   public AA(AInternal someReference) {...}
}




package test.bundleA.internal

public class AInternal {...}

B 组:

package test.bundleB.api

public class ComponentB {

   @Inject
   public ComponentB(AA refToA) {...}
}

当我将使用导出包中捆绑 A 中的任何其他类时,我是否必须为它们中的每一个设置一个服务?

解决包内甚至包边界上的依赖注入问题的常用方法是什么?

4

2 回答 2

2

如果您不使用 Guice,我建议您使用 Eclipse+Bndtools 来创建您的 OSGi 包。使用 Bndtools,很容易创建 OSGi 包,也可以通过注释创建 DI。举个例子:

您在 bundleA 中有一个接口:

public interface Greeting {
   String sayHello(String name);
}

bundleB 中的一个实现,@Component使我们的包能够使用 OSGi 声明式服务。

@Component
public class ExampleComponent implements Greeting {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

最后是第三个 bundleC,您希望我们 DI 并将所有Greeting实现注入特定组件以供使用。

@Component
public class GreetingCommand {
    private Greeting greetingSvc;

    @Reference
    public void setGreeting(Greeting greetingSvc) {
        this.greetingSvc = greetingSvc;
    }

    public void greet(String name) {
        System.out.println(greetingSvc.sayHello(name));
    }
}

如您所见,@Reference表明您要注入Greeting接口的实现。上面的示例结合使用了 OSGi 声明式服务和 Bndtools。Bndtools 本身接受注释并创建 OSGi 使用声明式服务所需的 XML 文件。我不想更深入地了解它。请参阅 [1] 和 [2] 了解更多信息。只是想向您展示如何使用声明式服务和 Bndtools 制作 DI。

[1] http://bndtools.org/

[2] http://wiki.osgi.org/wiki/Declarative_Services

于 2013-08-22T11:03:40.537 回答
0

好吧,有一个名为Peaberry的扩展库,它提供 Guice 与 OSGi 的集成。有一个很好的例子,如何将一个服务包注入另一个包。

希望你会发现它有帮助。

于 2013-08-22T14:36:38.677 回答