Java 在OSGi环境中开始使用bundle DI

Java 在OSGi环境中开始使用bundle DI,java,osgi,apache-felix,Java,Osgi,Apache Felix,我已经用ApacheFelix作为OSGi运行时开发了一个应用程序一段时间了,到目前为止,进展非常顺利。然而,我现在想采用依赖注入,ApacheFelix的“默认”机制似乎是IPOJO 然而,我发现有关ApacheFelix的文档和教程太薄弱,我还没有找到任何地方。所以我准备改变,但首先我最好解释一下我想做的(非常简单的)事情 给定两个束 消费者捆绑 生产者捆绑 我希望OSGi运行时启动消费者捆绑包,认识到它需要一个生产者才能工作,然后框架启动生产者捆绑包并将实例注入消费者。简单。IPOJO建议

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

然而,我发现有关ApacheFelix的文档和教程太薄弱,我还没有找到任何地方。所以我准备改变,但首先我最好解释一下我想做的(非常简单的)事情

给定两个束

消费者捆绑

生产者捆绑

我希望OSGi运行时启动消费者捆绑包,认识到它需要一个生产者才能工作,然后框架启动生产者捆绑包并将实例注入消费者。简单。IPOJO建议只使用注释(@Singleton、@Inject)或类似的方法就可以做到这一点,但我无法让它工作。OSGi显然有声明性服务,但这意味着要编写大量XML,这是我真正想要避免的

Anywoo,我准备采用JBoss、Equinox或替代OSGi运行时和替代依赖注入机制,比如Peaberry、SpringDM或其他完全不同的东西。我已经在用Maven了

我想问的是,有人能用制作人和消费者的想法创建一个Hello World来帮助我开始吗?我真的花了很多时间阅读,发现学习曲线无法逾越



编辑,我尝试使用SCR:

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

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

问候,,
Dmytro

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

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

问候,,
Dmytro

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

依赖注入不是核心OSGi(即Felix框架)的一部分,因此在部署自己的iPOJO包之前,必须先部署iPOJO包。此外,您还需要添加IPOJO所需的元数据,谷歌“maven IPOJO插件”获取更多信息

如果你正在寻找一个比Felix本身更简单的容器,那么试试吧(它附带了很多企业附加功能)

就个人而言,我喜欢声明式服务(so+1 Dmytro),因为它非常简单,只需从OSGi中删除锅炉板代码(记住也要部署,并在包中提供component.xml,请参阅以获取更多信息)


编辑 (回复评论并链接到下面的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、install时,通过这种方式您可以轻松地从本地和远程存储库安装捆绑包

首先让maven为您下载一个版本(pax url mvn 1.3.5版可用),然后安装该文件(或复制到Felix bundle dir)

现在,您可以使用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.
-> 

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

依赖注入不是核心OSGi(即Felix框架)的一部分,因此在部署自己的iPOJO包之前,必须先部署iPOJO包。此外,您还需要添加IPOJO所需的元数据,谷歌“maven IPOJO插件”获取更多信息

如果你正在寻找一个比Felix本身更简单的容器,那么试试吧(它附带了很多企业附加功能)

就个人而言,我喜欢声明式服务(so+1 Dmytro),因为它非常简单,只需从OSGi中删除锅炉板代码(记住也要部署,并在包中提供component.xml,请参阅以获取更多信息)


编辑 (回复评论并链接到下面的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、install时,通过这种方式您可以轻松地从本地和远程存储库安装捆绑包

首先让maven为您下载一个版本(pax url mvn 1.3.5版可用),然后安装该文件(或复制到Felix bundle dir)

现在,您可以使用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 Service XML元素的注释来标记类;是的,这是一个有其自身局限性的黑客,但到目前为止,它在90多个捆绑包的项目中运行良好。如果您有兴趣,我可能会设法在本周清理、记录并发布它。

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

我同意答案,但想澄清一个误解。iPOJO不一定是Felix的“默认”DI框架,它只是Apache托管的另一个项目。iPOJO处理Felix、Equinox、Knopflerfish等。声明服务(DS)也处理Felix、Equinox、Knopflerfish。。。
-> 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.
->