我有OSGi模块化系统,其中包含以下组件:一些特定的协议实例实现,表示通过特定协议到特定服务器的连接(由每个连接服务实例化)一些特定的协议实例管理器服务,根据需要创建和预配置实例(通常来自不同捆绑软件的多个单调服务)连接管理器,它聚合协议管理器服务并要求它们在需要时提供协议实例(单个单调服务)它们被打包为OSGi捆绑软件,如下所示:`-ConnectionManager `-ConnectionManager.class`-IrcProtocol `-IrcProtocolManagerService.class `-IrcProtocolInstance.class`-XMPPProtocol `-XMPPProtocolManagerService.class `-XMPPProtocolInstance.classConnectionManager带有注释@Provides@Instantiate@Component并实现Subscriber接口,这使它具有通过某种类型的Event Admin传递和侦听传递的消息的功能。每个*ProtocolManager都用注释@Provides@Instantiate@Component并实现ProtocolManager接口,该接口可通过ConnectionManager服务侦听器进行发现。每个*ProtocolInstance都标有@Provides@Component并实现Subscriber接口。它还实现了ProtocolInstance接口,该接口提供了诸如connect()和disconnect()之类的通用连接操作。这里的问题是ProtocolInstance是由new运算符在ProtocolManager内部手动创建的,而不是由@Instantiate注释触发器手动创建的,因此-尽管它是注释。问题:如何正确地(最好在声明中带有注释)发布以编程方式创建的@Provides服务,而无需手动进入原始OSGi服务发布(至少在某种工厂之外)?或者,也许是如何重新构建我的系统,以使其更好地与不言而喻的iPOJO准则一起使用? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 iPOJO不支持使用“ new”创建对象。实际上,iPOJO实例不仅是此对象,而且还是包装它的容器。但是,您有两种解决方案:使用BundleContext(http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-faq.html#injecting-the-bundle-context-in-a-pojo)注册您的对象使用Factory服务即时创建实例(http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-factory-service.html) (adsbygoogle = window.adsbygoogle || []).push({});
07-27 21:24