在OSGi中使用服务和创建新对象的区别

在OSGi中使用服务和创建新对象的区别,osgi,aem,spring-dm,Osgi,Aem,Spring Dm,我是CQ5新手,当我研究OSGi概念时,我发现了一些叫做服务的东西。我创建了一个bundle,其中包含一个接口和实现类,该类覆盖该方法(只返回一个字符串“hello world”)。如果我想在jsp/some java类中使用该类,我将创建该对象的一个新实例并使用其方法。因此,我的问题是,创建新对象和使用服务之间的确切区别是什么。请提及服务相对于新对象的优势。并帮助使用spring DM配置服务 我想说,组件和服务的主要区别在于它们的生命周期是由OSGi管理的。这意味着它们的状态独立于使用组件的

我是CQ5新手,当我研究OSGi概念时,我发现了一些叫做服务的东西。我创建了一个bundle,其中包含一个接口和实现类,该类覆盖该方法(只返回一个字符串“hello world”)。如果我想在jsp/some java类中使用该类,我将创建该对象的一个新实例并使用其方法。因此,我的问题是,创建新对象和使用服务之间的确切区别是什么。请提及服务相对于新对象的优势。并帮助使用spring DM配置服务

我想说,组件和服务的主要区别在于它们的生命周期是由OSGi管理的。这意味着它们的状态独立于使用组件的类

您的OSGi服务有一个状态,它可以用来存储信息或响应消息,它们将超出使用它们的类的范围。它们还允许您将接口与实际实现分离。您可以轻松地在运行的实例中交换特定服务的实现(即,将提供程序从v1升级到v1.0.1)。此外,您可能希望在不关闭应用程序的情况下临时停止组件。服务激活后将重新连接

它们中的每一个的基本用例都与它们的功能有关。如果一个类只是一个带有一些getter和setter的bean,那么您可能会实例化它,填充它,并在需要时使用它。另一方面,如果类提供某种功能(处理、存储、排队等)。它可能应该是一种服务。具有许多静态方法(帮助器、管理器)的类通常可以很容易地重构为服务


我不太清楚spring dm。但是在AdobeCQ5中,您通常使用声明性服务

除了@santiagozky的伟大回答之外,我还要补充一点,另一个主要区别是依赖关系管理


实例化对象时,继承其所有依赖项。您将永远受到实现中可能会更改这些依赖关系的更改的约束。在使用服务时,您遵循的是对接口进行编码的Java最佳实践。您的代码与实现无关,并且只依赖于接口依赖项,接口依赖项始终等于或小于实现。通常,依赖项的集合要小得多。修改现有实现或完全更改实现对您的代码没有影响。

您的问题与此问题大致相同:。对于Spring DM问题,请查看Spring DM站点,但这可能不是最好的方式,因为它不再受支持。嗨,santiagozky,感谢您的回复。您能否通过用例和示例来解释这一点(服务与新对象实例),或者提供我可以从中获得有关信息的链接。