繁体   English   中英

在OSGi环境中使用Bundle DI入门

[英]Getting started with bundle DI in an OSGi environment

一段时间以来,我一直在使用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

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

您可以使用Java注释通过Maven SCR插件描述DS依赖项,服务和组件

此致Dmytro

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

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

如果您要寻找的容器比Felix本身少一些,那么请尝试Karaf (它附带许多企业附加功能)。

就个人而言,我喜欢声明式服务(即+1 Dmytro),因为它非常简单,并且仅从OSGi中删除了样板代码(请记住也要部署并在您的捆绑包中提供component.xml,有关更多信息,请参见maven-scr-plugin )。 。


编辑

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

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

通过添加unbind()方法并更改@Reference的以下工作,生成的SCR component.xml对于Consumer而言不太正确:

//...
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时,请安装Pax Url for maven ,这样您就可以轻松地从本地和远程存储库安装捆绑软件。

首先让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.
-> 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM