Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OSGi:何时使用组件框架,何时自己创建对象_Osgi_Declarative Services - Fatal编程技术网

OSGi:何时使用组件框架,何时自己创建对象

OSGi:何时使用组件框架,何时自己创建对象,osgi,declarative-services,Osgi,Declarative Services,我已经做了将近一年的AEM开发者了。我知道AEM使用“声明性服务组件框架”来管理OSGi组件的生命周期 考虑一个场景,当我从一个包中导出一个包并从另一个包中导入该包时,我可以在第二个包中的第一个包中创建类的对象。在这种情况下,这是一份进出口合同。 我的问题是什么时候我应该使用组件框架来管理我的对象的生命周期,什么时候我应该自己处理它,在需要时创建它们。如果您的对象是服务,那么毫无疑问,它们必须是OSGi组件 对于其他方面,我的第一选择是OSGi组件,除非它们是像数据保持器或类似的琐碎对象 如果一

我已经做了将近一年的AEM开发者了。我知道AEM使用“声明性服务组件框架”来管理OSGi组件的生命周期

考虑一个场景,当我从一个包中导出一个包并从另一个包中导入该包时,我可以在第二个包中的第一个包中创建类的对象。在这种情况下,这是一份进出口合同。

我的问题是什么时候我应该使用组件框架来管理我的对象的生命周期,什么时候我应该自己处理它,在需要时创建它们。

如果您的对象是服务,那么毫无疑问,它们必须是OSGi组件

对于其他方面,我的第一选择是OSGi组件,除非它们是像数据保持器或类似的琐碎对象

如果一个对象需要配置或引用OSGi服务,那么它显然也是一个OSGi组件


通常,IMO最好考虑服务,并将包导出定义为允许其他包使用包的服务的最小值。除非捆绑包显然是一个可重用的库,比如commons io(举个简单的例子)。

如果对象是服务,那么毫无疑问,它们必须是OSGi组件

对于其他方面,我的第一选择是OSGi组件,除非它们是像数据保持器或类似的琐碎对象

如果一个对象需要配置或引用OSGi服务,那么它显然也是一个OSGi组件


通常,IMO最好考虑服务,并将包导出定义为允许其他包使用包的服务的最小值。除非捆绑包显然是一个可重用的库,比如commons io(举个简单的例子)。

在理想的设计中,您实际上无法从导出的包创建对象;因为该包将只包含接口。这使其成为“纯”合同(API)导出。如果其中有可以直接实例化的类,那么它们就是实现类

一般来说,只导出纯API并隐藏实现类要好得多。主要原因有两个:

  • 实现类往往具有下游依赖关系。如果您直接从一个实现类依赖到另一个实现类,那么您会得到一个非常大且脆弱的依赖关系图。。。最终,该图将包含一个循环。事实上,这几乎是不可避免的。在这一点上,您的应用程序不是模块化的,因为您无法独立地部署或更改它的任何部分

  • 纯接口可以分析版本之间的兼容性。作为API的使用者或提供者,您确切地知道可以支持哪些版本的API,因为API不包含可执行代码。然而,如果您依赖于一个实现类,那么您永远不会真正知道它们何时会破坏兼容性,因为这种破坏可能发生在您无法轻松分析的可执行代码的深处


  • 在理想的设计中,实际上不能从导出的包中创建对象;因为该包将只包含接口。这使其成为“纯”合同(API)导出。如果其中有可以直接实例化的类,那么它们就是实现类

    一般来说,只导出纯API并隐藏实现类要好得多。主要原因有两个:

  • 实现类往往具有下游依赖关系。如果您直接从一个实现类依赖到另一个实现类,那么您会得到一个非常大且脆弱的依赖关系图。。。最终,该图将包含一个循环。事实上,这几乎是不可避免的。在这一点上,您的应用程序不是模块化的,因为您无法独立地部署或更改它的任何部分

  • 纯接口可以分析版本之间的兼容性。作为API的使用者或提供者,您确切地知道可以支持哪些版本的API,因为API不包含可执行代码。然而,如果您依赖于一个实现类,那么您永远不会真正知道它们何时会破坏兼容性,因为这种破坏可能发生在您无法轻松分析的可执行代码的深处