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

10

我有些困惑以下事情。我知道在定义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. 如何使用被定义为 @Component 的类作为服务,可以通过 sling.getService(ServiceName.class) 访问服务

2个回答

9
  1. 一个服务可以不使用@Component注解进行发布,但您必须以编程方式执行。如果您使用注解,则可以从构建工具中自动生成元数据,并从声明式服务运行时框架中受益。这简化了很多事情。如果要使用低级代码完成它,则必须编写BundleActivator的实现,使用Bundle-Activator清单头进行声明,调用context.registerService等。底线:只需使用@Component注解!

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

3. 我不理解这个问题。

  1. 未作为服务发布的组件无法从包外访问。如果要使它可访问,则必须将其作为服务。如果您认为这很无用,请考虑创建HTTP服务器的组件。它打开端口80并响应来自外部世界的网络请求。因此,即使它不是服务且无法从其他捆绑包中访问,它也可以执行一些有用的操作。这种组件就像是您的应用程序与外界之间的桥梁,而服务则是您的应用程序内部各部分之间的桥梁。

点1和点2可行。第三个问题是关于如何使用仅使用@Component注释定义的类。例如:服务类可以通过sling.getService(ServiceName.class)访问。 - Rupesh
被标记为@Component的类,但不作为服务发布的类无法从包外部访问。这就是关键所在...如果你想要从外部调用,那就成为一个服务吧。 - Neil Bartlett
优美的解释 - Oliver

2
  • OSGi是一种安装和管理bundle的框架。在OSGi中,所有需要存在的组件都必须是一个组件,无论是简单组件、服务还是servlet。这就是为什么我们需要在服务中使用@Component。

  • 服务是单例的。所有需要管理单例类和使用服务引用的操作都由OSGi完成,我们不需要进行任何操作。因此,一切都是自动管理的。

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


部分回答了我的问题 - Rupesh
1
我不确定我买下了大部分的这个答案。 - ebullient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接