为什么在CQ中为每个服务使用@Component注释

时间:2015-01-23 07:11:35

标签: osgi cq5

我对跟进事情感到有点困惑。我理解当我们在OSGi中定义组件或服务时,@Service@Component注释是主要注释。我指的是http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.htmlWhat is the difference between OSGi Components and Services

问题:

  1. 如果没有@Component注释,就无法创建服务,为什么会这样?

  2. 我理解一旦我们定义了一个服务,它的生命周期由OSGi管理的不同,但这样做有什么好处?

  3. 如何通过sling.getService(ServiceName.class)

  4. 访

2 个答案:

答案 0 :(得分:9)

  1. 可以在没有@Component注释的情况下发布服务 ,但您必须以编程方式执行此操作。如果使用注释,那么您将从构建工具中的自动元数据生成以及Declarative Services运行时框架中受益。这简化了很多事情。如果您想使用低级代码执行此操作,则必须编写BundleActivator的实现,使用Bundle-Activator清单标头声明,调用context.registerService等。底线:只需使用@Component注释!

  2. 简单:懒惰。当组件是服务时,它可以“按需”懒惰地实例化,即仅当消费者首次尝试使用该服务时。另一方面,非服务组件通常在其自身内部执行其他类型的操作,例如,无论如何,运行Web服务器或GUI或轮询线程。这些需要一直运行,而不是按需运行。

  3. <击> 3。我不明白这个问题。

    1. 无法从捆绑包外部访问未作为服务发布的组件。如果您希望它可以访问,那么它必须是一项服务。如果您认为这没用,请考虑创建HTTP服务器的组件。它打开端口80并响应来自外部世界的网络请求。所以它做了一些有用的事情,即使它不是服务而且无法从其他捆绑包中访问。这种组件就像是应用程序与外部世界之间的桥梁;而服务是应用程序的一部分与另一部分之间的桥梁。

答案 1 :(得分:2)

  • OSGi是捆绑软件的安装和管理方式。 OSGi中需要的所有东西都必须是简单组件,服务或servlet的组件。这就是我们需要将@Component与服务一起使用的原因。

  • 服务是单身人士。需要为Singleton类管理并使用服务引用的所有内容都由OSGi完成。我们无需做任何事。所以一切都是自动管理的。

  • 你不能访问那样的组件。组件是独立使用的。引用不同帖子的例子: 假设您想要一个位于套接字上的写入服务器组件,并通过TCP / IP响应请求。组件启动时,它会打开套接字并创建为客户端提供服务所需的线程。当它停止时,它会关闭线程和套接字