OSGi et les Components
Les Components
Définition
Un Component permet de gérer les services plus facilement et de manière dynamique. Il équivaut à une couche supplémentaire au dessus de la couche "Service". Le code des bundles devient également moins dépendant d'OSGi, car il n'est plus nécessaire d'utiliser des classes spécifique au framework comme les BundleActivator, les ServiceReferences, etc ...
La publication et la recherche de service ne se fait plus dans le code, mais se déclare dans un fichier XML. Plus de registerService, getServiceReference et getService. Ce fichier XML doit être référencé dans le fichier manifest, pour que le framework prenne en compte ses informations.
Publication d'un service
Comme dit précédemment, les BundleActivator ne sont plus nécessaire et les service peuvent être enregistrer directement par l'intermédiaire du fichier xml. Le bundle fournissant un service ne possède donc plus que l'implémentation du service, le fichier manifest et des fichier .xml qui vont décrire des composant fournit par notre bundle.
Sur l'image suivante, vous pouvez voir le nouveau fichier manifest et un fichier .xml décrivant notre composant qui va fournir un service

Ce fichier component.xml précise au framework que HelloWorldImpl est l'implémentation de notre composant, et qu'elle répond également au contrat, l'interface, HelloWorld. Dés que le bundle est "Active" au sein du framework, ce service est accessible par tout les autres bundles.
Utilisation d'un service
Pour utiliser un service, la logique est la même que lors de ça publication. Plus de ServiceReference ni de BundleActivator. On va créé un composant actif.
Pour celà, dans le fichier xml, on va indiquer l'implémentation de notre composant, et renseigner deux champs supplémentaire : "activate" et "deactivate", qui indique au framework quel méthodes de l'implémentation doivent être appelé lorsque notre composant est activé (équivalent au start du BundleActivator) et désactivé (équivalent au stop du BundleActivator).
Notre composant doit également avoir accès à un service remplissant le contrat HelloWorld. Pour celà, on utilise la balise reference possèdant les champ suivant :
- interface : le contrat du service
- cardinality : le nombre de service que le composant peut utiliser simultanéement
- bind : la méthode appelé lorsqu'un servie apparait
- unbind : la méthode appelé quand un service disparait
