我一直在用Apache Felix开发一个应用程序作为我的OSGi运行时一段时间,直到现在进展一直很好。但是,我现在想采用依赖注入,Apache Felix的“默认”机制似乎是iPOJO。
但是,我发现围绕Apache felix的文档和教程太弱了,我没有设法到达任何地方。所以我准备改变,但首先我会更好地解释(非常简单)我想要做的事情。
给出两个捆绑包;
消费者套装
package bundles.consumer;
class Consumer implements BundleActivator{
@Inject
private Producer producer;
public void bundleActivated(BundleContext con) {
this.producer.getNextItem();
}
}
制片人套装
package bundles.producer;
@Singleton
class Producer {
public String getNextItem() {
return "item x";
}
}
我希望OSGi运行时启动Consumer包,意识到它需要一个Producer才能工作,然后框架启动Producer包并将Consumer和实例注入到Consumer中。 Simples。 iPOJO建议只使用注释(@Singleton,@ Inject)或类似的方法,但我根本无法使用它。 OSGi显然具有声明性服务,但这意味着要编写大量的XML,我 想要避免这些。
Anywoo,我准备适应JBoss,Equinox或替代OSGi运行时和替代的依赖注入机制,是Peaberry,Spring DM或者其他完全不同的东西。我已经在使用Maven了。
我问的是,有人可以使用Producer和Consumer的想法来创建一个Hello World来帮助我开始吗?我真的花了很多时间阅读,发现学习曲线难以克服!
编辑,我尝试使用SCR:http://tydus.net/codeExamples/mvnScr.tar
答案 0 :(得分:2)
答案 1 :(得分:1)
要记住两件事; 1)你的bundle可能需要一些额外的依赖注入框架元数据; 2)你需要部署DI框架的运行时。
依赖注入不是核心OSGi(即Felix框架)的一部分,因此您必须先部署iPOJO软件包,然后再部署自己的软件包。此外,您还需要添加IPOJO所需的元数据,谷歌“maven-ipojo-plugin”以获取更多信息。
如果您正在寻找一个比Felix更不容易的容器,那么请尝试Karaf(它附带了许多企业附加功能)。
就个人而言,我喜欢Declarative Services(所以+1 Dmytro),因为它非常简单,只是从OSGi中删除了样板代码(记得也要部署it并在你的bundle中提供component.xml参见{{ 3}}了解更多信息)。
(回答评论并链接到下面的tarball)
我将@Service注释从Producer移动到ProducerImpl。
生成的SCR component.xml对于Consumer来说并不完全正确,通过添加unbind()方法并更改@Reference以下工作:
//...
import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
import static org.apache.felix.scr.annotations.ReferencePolicy.DYNAMIC;
//...
@Component
public class Consumer
{
@Reference(policy = DYNAMIC, cardinality = MANDATORY_UNARY)
private Producer producer;
public void unbindProducer() {
System.out.println("Producer unbound.");
this.producer = null;
}
//...
}
部署Maven
当您使用maven时,请安装maven-scr-plugin,这样您就可以轻松地从本地和远程存储库安装捆绑包。
首先让maven为您下载一个版本(pax-url-mvn版本1.3.5可用)然后安装该文件(或复制到Felix bundle dir)
-> install file:/YOUR_PATH_TO_MAVEN_REPO/.m2/repository/org/ops4j/pax/url/pax-url-mvn/1.3.5/pax-url-mvn-1.3.5.jar
Bundle ID: 7
-> start 7
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.net.ssl) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.xml.parsers) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.cm)(version>=1.0.0)(!(version>=2.0.0))) -> [2.0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.url)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.w3c.dom) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.xml.sax) -> [0]
->
您现在可以使用mvn URL处理程序从本地存储库安装自己的软件包:
-> install mvn:com.examples/producer/1.0.1
Bundle ID: 10
-> start 10
-> install mvn:com.examples/consumer/1.0.1
Bundle ID: 11
-> start 11
DEBUG: WIRE: [11.0] osgi.wiring.package; (&(osgi.wiring.package=com.examples.producer)(version>=1.0.0)(!(version>=2.0.0))) -> [10.0]
Producer bound.
Consumer activate
Aloha.
->
答案 2 :(得分:0)
我为Equinox Declarative Services包编写了一个片段,允许您使用与DS servicce XML元素对应的annoations标记您的类;是的,这是一个有其自身局限性的黑客,但到目前为止它在90多个捆绑的项目中运作良好。如果你有兴趣,我本可以设法清理它,记录并在本周发布它。