首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OSGi环境中开始使用包DI

在OSGi环境中开始使用包DI
EN

Stack Overflow用户
提问于 2012-01-10 00:58:48
回答 3查看 2K关注 0票数 0

我已经用Apache作为我的OSGi运行时开发了一个应用程序一段时间了,到目前为止,进展非常顺利。但是,我现在想采用依赖注入,Apache的“默认”机制似乎是iPOJO。

但是,我发现关于Apache的文档和教程太弱了,我还没有得到任何进展。所以我已经做好了改变的准备,但首先我最好解释一下我想做的(非常简单的)想法。

给出两束;

消费束

代码语言:javascript
复制
package bundles.consumer;

class Consumer implements BundleActivator{
    @Inject
    private Producer producer;

    public void bundleActivated(BundleContext con) {
        this.producer.getNextItem();
    }
}

制片束

代码语言:javascript
复制
package bundles.producer;

@Singleton
class Producer {
    public String getNextItem() {
        return "item x"; 
    }
}

我希望OSGi运行时启动消费者包,意识到它需要一个生产者才能工作,然后框架启动生产者包并将其注入到消费者中。小甜饼。iPOJOs建议,只使用注释(@Singleton,@Inject)或类似的方式是可能的,但我根本无法让它工作。OSGi显然有声明性服务,但这意味着要编写大量的XML,这是我真正想要避免的。

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

我想问的是,有人能用生产者和消费者的想法创造一个Hello来帮助我开始吗?我真的花了一吨时间阅读,发现学习曲线是无法克服的!

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-10 09:02:29

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

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

如果您正在寻找一个比Felix自己的容器更简单的容器,那么就试试卡拉夫 (它附带了许多企业额外的功能)。

就我个人而言,我喜欢声明性服务(so +1 Dmytro),因为它非常简单,只是从OSGi中删除了锅炉板代码(记住也要部署并在包中提供component.xml --参见maven-scr-插件获取更多信息)。

编辑

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

我将@Service注释从生产者移到了ProducerImpl。

通过添加unbind()方法并更改@Reference,对于使用者来说,生成的SCR component.xml并不完全正确,方法如下:

代码语言:javascript
复制
//...
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版本1.3.5可用),然后安装该文件(或复制到Felix dir)

代码语言:javascript
复制
-> 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处理程序从本地存储库中安装自己的包:

代码语言:javascript
复制
-> 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.
-> 
票数 1
EN

Stack Overflow用户

发布于 2012-01-10 08:10:41

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

您可以使用Java注释来用Maven SCR插件描述DS依赖项、服务和组件。

你好,德米特罗

票数 2
EN

Stack Overflow用户

发布于 2012-01-10 09:45:22

我为Equinox声明性服务包编写了一个片段,它允许您用与DS元素相对应的烦扰标记类;是的,它有其自身的局限性,但到目前为止,它在带有90+包的项目中运行良好。如果你有兴趣的话,我可能会设法把它清理干净,并在本周把它记录下来并发表出来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8797301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档