Under OSGi, what are the main differences between Components vs Services? As I understand it, all Services must be Components, but not all Components must be services.
What are the benefits of using one over the other with sample use cases?
OSGi Component — FetchTODO As we discussed earlier, an OSGi component is the entity whose lifecycle will be managed by the OSGi container. To make a class act as component, we annotate it with @Component . We can start, stop and configure the component using Apache Felix Web Console.
We can define a class as a service by adding the following scr annotations: @Component – defines the class as a component. @Service - defines the service interface that is provided by the component.
An OSGi service is a Java class or service interface, along with a number of service properties as name/value pairs. The service properties differentiate among different service providers that provide services with the same service interface.
What is a Service? An OSGi service is a java object instance, registered into an OSGi framework with a set of properties. Any java object can be registered as a service, but typically it implements a well-known interface.
"Components" are less formally defined than services.
A service is any object that is registered in the OSGi Service Registry and can be looked up using its interface name(s). The only prerequisite is that a service should implement some interface... any interface. For example I could register a runnable object under the java.lang.Runnable
interface, and clients could look it up using that interface name.
A "component" tends to be an object whose lifecycle is managed, usually by a component framework such as Declarative Services (DS), Blueprint or iPOJO. See this page on the OSGi Community Wiki for a discussion of the different component frameworks available.
A component may have any of the following features, in combination or alone:
In general, using a component framework is the easiest way to work with OSGi services because the framework will manage the binding to the services that you want to consume. For example you could say that your component "depends on" a particular service, in which case the component will only be created and activated when that service is available -- and also it will be destroyed when the service becomes unavailable.
EDIT: See Neil Bartlett's answer, I've answered quite specifically wrt Declarative Services but it's more subtle than I've stated incorrectly here.
In short: Components are consumers of services not providers, Services are an extension of Components registring as service providers.
A component has a lifecycle (de/activate and modify), service dependency management (un/bind).
A service is an extension of a component; via the service registry, it offers it's services to other bundles etc by publishing implemented interfaces and properties.
The use-case for Services is obvious, the typical cases for using Components is needing management of lifecycle, configuration or service dependencies, but not needing/wanting to publish the Component for inter-bundle usage.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With