我已经构建了一个应用程序与依赖框架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) {...}
}
当我将使用束甲任何其他类从导出的包,那么我有没有为他们每个人设立一项服务?
什么是解决捆绑内甚至捆绑边界的依赖注入问题的常用方法?
christian,谢谢你的回答。但是如果我理解正确的话,bndtools只会为声明式服务生成xml,这可以被OSGi框架用于服务注册。然后,我仍然遇到ExampleComponent(我的AA类)确实对它自己的包(AInternal)中的内部类有依赖性的问题。没有无参数构造函数时,OSGi无法创建ExampleComponent。我可以使用额外的setter,但这是DI setter与构造函数注入的另一个故事/讨论 – SimFirehawk
接口描述在另一个bundle中。通常你不会把你的实现和你的接口放到同一个bundle中。因此,你只需要一个依赖项,比如说,API包和消费者具有相同的依赖关系,但从不包含到实现包中。因此,消费者从来没有与实施本身直接相关,这就是DI想要解决的问题,对吧?! –
我认为不管接口描述是在同一个捆绑包还是另一个捆绑包都没关系。即使接口在另一个包中,我们称之为AInterface,但实现AInterface的ExampleComponent(服务提供者)仍然会以某种方式由osgi框架实例化。但是ExampleComponent有一个额外的内部依赖。该框架无法实例化?我错了吗? – SimFirehawk