0

一段时间以来,我一直在开发一个使用 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 中。简单的。iPOJO 建议仅使用注释(@Singleton、@Inject)或类似的方法来实现这一点,但我根本无法让它工作。OSGi 显然具有声明式服务,但这意味着要编写大量 XML,而我真的想避免这种情况。

Anywoo,我准备适应 JBoss、Equinox 或替代 OSGi 运行时和替代依赖注入机制,无论是 Peaberry、Spring DM 还是完全不同的东西。我已经在使用 Maven。

我要问的是,有人可以使用生产者和消费者的想法创建一个 Hello World 来帮助我入门吗?我真的花了很多时间阅读并发现学习曲线无法克服!


编辑,我尝试使用 SCR:http ://tydus.net/codeExamples/mvnScr.tar

4

3 回答 3

2

最好使用声明式服务,因为它是 OSGi 标准。

您可以使用 Java Annotations 来描述带有Maven SCR 插件的 DS 依赖项、服务和组件

问候, Dmytro

于 2012-01-10T08:10:41.127 回答
1

有两件事要记住;1)您的包可能需要一些额外的元数据用于依赖注入框架,并且 2)您需要部署 DI 框架的运行时。

依赖注入不是核心 OSGi(即 Felix 框架)的一部分,因此您必须先部署 iPOJO 捆绑包,然后再部署自己的捆绑包。此外,您需要添加 IPOJO 所需的元数据,谷歌“maven-ipojo-plugin”以获取更多信息。

如果您正在寻找一个比 Felix 本身更简单的容器,那么请尝试Karaf(它带有许多企业附加功能)。

就个人而言,我喜欢声明式服务(所以 +1 Dmytro),因为它非常简单,只是从 OSGi 中删除了样板代码(记住也要部署并在你的包中提供 component.xml,请参阅maven-scr-plugin了解更多信息) .


编辑

(回答评论并链接到下面的 tarball)

我将 @Service 注释从 Producer 移到了 ProducerImpl。

通过添加一个 unbind() 方法并更改 @Reference ,生成的 SCR component.xml 对消费者来说并不完全正确:

//...
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 安装 Pax Url,这样您就可以轻松地从本地和远程存储库安装包。

首先让 maven 为您下载一个版本(pax-url-mvn 版本 1.3.5 可用)然后安装文件(或复制到 Felix 捆绑目录)

-> 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.
-> 
于 2012-01-10T09:02:29.120 回答
0

我为 Equinox 声明式服务包编写了一个片段,它允许您使用对应于 DS 服务 XML 元素的注释来标记您的类;是的,这是一个有其自身局限性的 hack,但到目前为止,它在包含 90 多个捆绑包的项目中运行良好。如果您有兴趣,我可能会在本周清理、记录和发布它。

于 2012-01-10T09:45:22.157 回答