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

Why use @Component annotation with each service in CQ

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

问题:

  1. 没有@Component注解无法创建服务,为什么?

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

  3. 我们如何使用定义为@Component 的class 因为可以通过sling.getService(ServiceName.class)

  4. 访问服务
  • OSGi 是安装和管理包的地方。 OSGi 中需要的一切都必须是一个组件,无论是简单的组件、服务还是 servlet。这就是为什么我们还需要将@Component 与服务一起使用。

  • 服务是单例的。需要为 Singleton class 管理和使用服务引用的一切都由 OSGi 完成。我们这边什么也不必做。所以一切都是自动管理的。

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

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

  2. 很简单:懒惰。当组件是服务时,它可以延迟实例化 "on-demand",即仅当消费者首次尝试使用该服务时。 Non-service 组件,另一方面,通常在它们内部做其他类型的事情,例如运行 Web 服务器或 GUI 或轮询线程,随便什么。这些需要一直是 运行,而不是 on-demand.

3。我没看懂这个问题。

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