我对跟进事情感到有点困惑。我理解当我们在OSGi中定义组件或服务时,@Service
和@Component
注释是主要注释。我指的是http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html和What is the difference between OSGi Components and Services
问题:
如果没有@Component注释,就无法创建服务,为什么会这样?
我理解一旦我们定义了一个服务,它的生命周期由OSGi管理的不同,但这样做有什么好处?
如何通过sling.getService(ServiceName.class)
答案 0 :(得分:9)
可以在没有@Component
注释的情况下发布服务 ,但您必须以编程方式执行此操作。如果使用注释,那么您将从构建工具中的自动元数据生成以及Declarative Services运行时框架中受益。这简化了很多事情。如果您想使用低级代码执行此操作,则必须编写BundleActivator
的实现,使用Bundle-Activator
清单标头声明,调用context.registerService
等。底线:只需使用@Component
注释!
简单:懒惰。当组件是服务时,它可以“按需”懒惰地实例化,即仅当消费者首次尝试使用该服务时。另一方面,非服务组件通常在其自身内部执行其他类型的操作,例如,无论如何,运行Web服务器或GUI或轮询线程。这些需要一直运行,而不是按需运行。
<击> 3。我不明白这个问题。
答案 1 :(得分:2)
OSGi是捆绑软件的安装和管理方式。 OSGi中需要的所有东西都必须是简单组件,服务或servlet的组件。这就是我们需要将@Component与服务一起使用的原因。
服务是单身人士。需要为Singleton类管理并使用服务引用的所有内容都由OSGi完成。我们无需做任何事。所以一切都是自动管理的。
你不能访问那样的组件。组件是独立使用的。引用不同帖子的例子: 假设您想要一个位于套接字上的写入服务器组件,并通过TCP / IP响应请求。组件启动时,它会打开套接字并创建为客户端提供服务所需的线程。当它停止时,它会关闭线程和套接字