我已经成为AEM开发人员近一年了。我知道AEM使用“声明服务”组件框架'管理OSGi组件的生命周期。
考虑一种情况,当我从一个包中导出一个包并从另一个包中导入该包时,我也可以在第二个包内的第一个包中创建类的对象。在这种情况下,它是一个进出口合同 我的问题是当我应该使用组件框架来管理我的对象的生命周期以及何时通过在需要时创建它们来自己处理它。
答案 0 :(得分:3)
如果您的对象是服务,那么毫无疑问,它们必须是OSGi组件。
对于其他事情,我的第一选择是OSGi组件,除非它们是数据持有者或类似东西之类的琐碎对象。
如果对象需要配置或引用OSGi服务,那么它也显然是OSGi组件。
一般而言,最好的IMO在服务中进行思考,并将您的包导出定义为允许其他捆绑包使用捆绑服务的最小值。除非捆绑包显然是一个可重用的库,如commons-io(举一个简单的例子)。
答案 1 :(得分:3)
在理想的设计中, NOT 实际上可以从导出的包中创建对象;因为该包只包含接口。这使它成为“纯粹”合同(API)导出。如果那里有可以直接实例化的类,那么它们就是实现类。
通常,最好只导出纯API并隐藏实现类。主要有两个原因:
实现类往往具有下游依赖性。如果您直接从实现类依赖于实现类,那么您将获得一个非常大且脆弱的依赖图...并且最终该图将包含一个循环。事实上,它几乎是不可避免的。此时,您的应用程序不是模块化的,因为您无法独立部署或更改其任何部分。
可以分析纯接口的版本之间的兼容性。作为API的使用者或提供者,您确切知道可以支持哪些API版本,因为API不包含可执行代码。但是,如果您依赖于实现类,那么您永远不会真正知道它们何时会破坏兼容性,因为破坏可能发生在您无法轻松分析的可执行代码的深处。