2013-08-22 111 views
0

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

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

我可以为bundle A中的AA类设置一个服务,这个服务会自动注入,但是如果bundle A对bundle 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) {...} 
} 

当我将使用束甲任何其他类从导出的包,那么我有没有为他们每个人设立一项服务?

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

回答

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; 
    } 
} 

而在要美迪并注入所有Greeting实施为使用特定组件结束第三bundleC。

@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

+0

christian,谢谢你的回答。但是如果我理解正确的话,bndtools只会为声明式服务生成xml,这可以被OSGi框架用于服务注册。然后,我仍然遇到ExampleComponent(我的AA类)确实对它自己的包(AInternal)中的内部类有依赖性的问题。没有无参数构造函数时,OSGi无法创建ExampleComponent。我可以使用额外的setter,但这是DI setter与构造函数注入的另一个故事/讨论 – SimFirehawk

+0

接口描述在另一个bundle中。通常你不会把你的实现和你的接口放到同一个bundle中。因此,你只需要一个依赖项,比如说,API包和消费者具有相同的依赖关系,但从不包含到实现包中。因此,消费者从来没有与实施本身直接相关,这就是DI想要解决的问题,对吧?! –

+0

我认为不管接口描述是在同一个捆绑包还是另一个捆绑包都没关系。即使接口在另一个包中,我们称之为AInterface,但实现AInterface的ExampleComponent(服务提供者)仍然会以某种方式由osgi框架实例化。但是ExampleComponent有一个额外的内部依赖。该框架无法实例化?我错了吗? – SimFirehawk

0

那么,有称为Peaberry,其提供集成吉斯使用OSGi一个扩展库。有很好的example如何将服务包注入到另一个包中。

希望你会发现它有帮助。