依赖注入OSGI

时间:2013-08-22 09:40:03

标签: dependency-injection osgi bundle guice

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

我目前面临的主要问题是如何正确设置依赖注入。我有捆绑A,它导出一些包。然后Bundle B定义了一个组件,它需要注入束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中的任何其他类时,我是否必须为每个类设置一个服务?

解决捆绑内部依赖注入问题甚至是捆绑边界的常见方法是什么?

2 个答案:

答案 0 :(得分:2)

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

您在bundleA中有一个界面:

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

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

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

最后,你想要我们DI的第三个bundleC,并将所有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 Declarative Services与Bndtools结合使用。 Bndtools本身接受注释并创建OSGi使用Declarative Services所需的XML文件。我不想深入研究它。有关更多信息,请参阅[1]和[2]。只想通过使用声明性服务和Bndtools向您展示DI是如何制作的。

[1] http://bndtools.org/

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

答案 1 :(得分:0)

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

希望你会发现它有用。