我已经使用依赖框架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中的任何其他类时,我是否必须为每个类设置一个服务?
解决捆绑内部依赖注入问题甚至是捆绑边界的常见方法是什么?
答案 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 :(得分:0)