在OSGi环境中开始使用bundle DI

时间:2012-01-10 00:58:49

标签: java osgi apache-felix

我一直在用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

3 个答案:

答案 0 :(得分:2)

最好使用Declarative Service,因为它是OSGi标准。

您可以使用Java Annotations来使用Maven SCR plugin

来描述DS依赖项,服务和组件

此致 德米特罗

答案 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多个捆绑的项目中运作良好。如果你有兴趣,我本可以设法清理它,记录并在本周发布它。