< Précédent | Suivant >

Leçon 7 : Ajout de l'injection de dépendance entre les bundles

Dans la leçon précédente, vous avez appris à utiliser l'injection de dépendance dans un bundle. L'injection de dépendance entre les bundles nécessite une entrée supplémentaire de référence dans le fichier de configuration Blueprint.

Avant de commencer cette leçon, arrêtez le serveur. Dans la vue serveurs (Fenêtre > Afficher la vue > Serveurs), cliquez avec le bouton droit sur WebSphere Application Server, puis sélectionnez Arrêter.

Création d'un projet de bundle

Pour créer un projet de bundle et l'ajouter à un projet d'application OSGi :
  1. Cliquez sur Fichier > Nouveau > Autre, puis développez OSGi.
  2. Cliquez sur Projet de bundle OSGi, puis sur Suivant. Le nouveau projet de bundle OSGi s'ouvre.
  3. Dans la zone Nom du projet, entrez CounterWorldBundle.
  4. Sélectionnez l'un des serveurs suivants dans la liste d'exécution Cible :
    • WebSphere Application Server v7.0
    • WebSphere Application Server v8.0
    • WebSphere Application Server v8.5
    • WebSphere Application Server V8.5 Liberty Profile
  5. Vérifiez que CounterApp s'affiche dans la zone du projet Projet d'application, puis cliquez sur Terminer.

Ajout d'un service au bundle

Dans cette leçon, vous créez un service simple, World, qui renvoie une chaîne de texte à partir de la méthode World.getText().
  1. Créez le package :
    1. Dans l'Explorateur d'entreprise, développez CounterWorldBundle.
    2. Cliquez avec le bouton droit sur src, puis sélectionnez Nouveau > Package. L'assistant de nouveau package Java™ s'ouvre.
    3. Dans la zone Nom, tapez com.ibm.ws.eba.world, puis cliquez sur Terminer. Le package est créé dans le dossier src.
  2. Créez la classe d'interface :
    1. Cliquez avec le bouton droit sur le package com.ibm.ws.eba.world, puis cliquez sur Nouveau > Interface. L'assistant de nouvelle interface Java s'ouvre.
    2. Dans la zone Nom, entrez World, puis cliquez sur Terminer. L'interface est créée dans le package et s'ouvre dans l'éditeur.
    3. Ajoutez la méthode getText() à l'interface. Le code suivant en résulte :
      package com.ibm.ws.eba.world;
      
      public interface World {
      	public String getText();
      }
    4. Sauvegardez World.java.
  3. Créez la classe d'implémentation :
    1. Cliquez avec le bouton droit sur le package com.ibm.ws.eba.world, puis cliquez sur Nouveau > Classe. L'assistant de nouvelle classe Java s'ouvre.
    2. Dans la zone Nom, tapez WorldImpl.
    3. A côté de la liste des interfaces, cliquez sur Ajouter. La boîte de dialogue Sélection des interfaces implémentées s'ouvre.
    4. Dans la zone Choisissez des interfaces, tapez World. Sélectionnez l'interface World pour com.ibm.ws.eba.world, puis cliquez sur OK.
    5. Cliquez sur Terminer. La classe est créée dans le package et s'ouvre dans l'éditeur.
    6. Ajoutez l'implémentation pour la méthode getText(). Ajoutez une méthode d'initialisation qui confirme que le service démarre sur le serveur. Le code suivant en résulte :
      package com.ibm.ws.eba.world;
      
      public class WorldImpl implements World {
      
        @Override
        public String getText() {
          return " World!";
        }
      		
        public void init() {
         System.out.println("WorldImpl.init() called.");
        }
      }
    7. Sauvegardez WorldImpl.java.
  4. Créez le fichier de configuration Blueprint :
    1. Cliquez avec le bouton droit sur le projet CounterWorldBundle et sélectionnez Nouveau > Autre > OSGi > Fichier Blueprint, puis cliquez sur Suivant.
    2. Cliquez sur Terminer. Le fichier de configuration Blueprint s'ouvre dans l'éditeur.
  5. Ajoutez les informations de configuration et assemblage de composant au fichier de configuration Blueprint :
    1. Dans l'onglet Conception de l'éditeur, cliquez sur Ajouter. La boîte de dialogue Ajouter un élément s'ouvre.
    2. Cliquez sur Bean, puis cliquez sur OK. Le bean est ajouté à votre configuration.
    3. Configurez le bean :
      • Dans la zone ID, tapez WorldBean.
      • Dans la zone Classe, cliquez sur Parcourir. La boîte de dialogue Sélection d'un type s'ouvre. dans la zone de nom Sélection d'un type, tapez WorldImpl, puis sélectionnez la classe WorldImpl. Cliquez sur OK.
      • Dans la zone Méthode d'initialisation, tapez init.
    4. Cliquez sur Blueprint, puis sur Ajouter. La boîte de dialogue Ajouter un élément s'ouvre.
    5. Cliquez sur Service, puis sur OK. Le service est ajouté à votre configuration.
    6. Configurez le service :
      • Dans la zone ID, tapez WorldService.
      • Dans la zone Interface, cliquez sur Parcourir, puis sélectionnez l'interface World.
      • Dans la zone Référence, cliquez sur Parcourir, puis sélectionnez Bean: WorldBean. Cliquez sur OK.
    7. Enregistrez ce fichier.
  6. Exportez le package :
    1. Développez CounterWorldBundle et cliquez deux fois sur Manifest: CounterWorldBundle pour ouvrir le fichier manifeste du bundle dans l'éditeur.
    2. Sélectionnez l'onglet Exécution.
    3. Dans la section Packages exportés de l'éditeur, cliquez sur Ajouter. La boîte de dialogue Packages exportés s'ouvre.
    4. Cliquez sur com.ibm.ws.eba.world dans la liste des packages, puis cliquez sur OK.
    5. Sauvegardez le fichier manifeste du bundle.

Mise à jour du bean pour utiliser le nouveau service

Maintenant que vous avez implémenté le service World, vous devez mettre à jour le bean GreetImpl et le fichier manifeste de bundle CounterServiceBundle pour l'utiliser.
  1. Importez le package :
    1. Dans l'Explorateur d'entreprise, développez CounterServiceBundle, puis cliquez deux fois sur Manifest: CounterServiceBundle pour ouvrir le fichier manifeste du bundle dans l'éditeur.
    2. Sélectionnez l'onglet Dépendances.
    3. Dans la section Packages importés de l'éditeur, cliquez sur Ajouter. La boîte de dialogue Packages importés s'ouvre.
    4. Cliquez sur com.ibm.ws.eba.world dans la liste des packages, puis cliquez sur OK.
    5. Sauvegardez le fichier manifeste du bundle.
  2. Mettez à jour GreetImpl.java :
    1. Dans l'Explorateur d'entreprise, développez CounterServiceBundle > src > com.ibm.ws.eba.counter, puis cliquez deux fois sur GreetImpl.java pour ouvrir le fichier dans l'éditeur.
    2. Ajoutez la déclaration de variable et la méthode set pour le bean World :
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    3. Dans le menu principal, cliquez sur Source > Organisation des importations. Les instructions import manquantes sont ajoutées à votre code.
    4. Mettez à jour la méthode getText() pour appeler le nouveau service :
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
      }
    5. Enregistrez ce fichier.
    Le code suivant en résulte :
    package com.ibm.ws.eba.counter;
    
    import com.ibm.ws.eba.world.World;
    
    public class GreetImpl implements Greet {
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    	
      private Counter counter;
    	
      public void setCounter(Counter c) {
        counter = c;
      }
    
      @Override
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
    }
    	
      public void init() {
        System.out.println("GreetImpl.init() called");
      }
    
    }

Mise à jour du fichier de configuration Blueprint

Pour que le conteneur Blueprint injecte une instance du bean World dans GreetImpl, vous devez ajouter la référence au fichier de configuration Blueprint.
  1. Développez CounterServiceBundle > BundleContent > OSGI-INF > blueprint et cliquez deux fois sur blueprint.xml pour ouvrir le fichier de configuration Blueprint dans l'éditeur.
  2. Dans l'onglet Conception de l'éditeur, sélectionnez Blueprint et cliquez sur Ajouter. La boîte de dialogue Ajouter un élément s'ouvre.
  3. Cliquez sur Référence, puis sur OK. La boîte de dialogue Détails des références s'ouvre.
  4. Configurez la référence :
    • Dans la zone d'ID de référence, tapez WorldRef.
    • Dans la zone d'interface de référence, cliquez sur Parcourir, puis sélectionnez l'interface World que vous avez créée. Cliquez sur OK.
    • Cliquez sur OK pour accepter les modifications et fermer la boîte de dialogue.
    La référence est ajoutée à votre fichier Blueprint.
  5. Dans la section Présentation, cliquez sur le noeud GreetBean (Bean), puis cliquez sur Ajouter. La boîte de dialogue Ajouter un élément s'ouvre.
  6. Cliquez sur Propriété, puis sur OK. La propriété est ajoutée à votre configuration.
  7. Configurez la propriété :
    • Dans la zone Nom, tapez worldBean.
    • Dans la zone Référence, cliquez sur Parcourir. La boîte de dialogue de sélection de référence s'ouvre. Cliquez sur Reference:WorldRef, puis sur OK.
  8. Enregistrez ce fichier.

Déploiement de l'application

  1. Dans l'Explorateur d'entreprise, développez CounterWebBundle > CounterWebBundle > Servlets.
  2. Cliquez avec le bouton droit sur CounterServlet et sélectionnez Exécuter en tant que > Exécuter sur le serveur. La boîte de dialogue Exécuter sur le serveur s'ouvre.
  3. Cliquez sur Terminer.

La chaîne greet.getText()=0 Hello World! s'affiche dans le navigateur. Chaque fois que la page est rechargée, la valeur augmente.

Passez à la vue Console (Fenêtre > Afficher la vue > Console) pour afficher la sortie du serveur. Une sortie réussie affiche la sortie de CounterImpl.init(), GreetImpl.init(), et WorldImpl.init(), selon les entrées de la méthode d'initialisation pour les beans CounterImpl, GreetImpl et WorldImpl du fichier Blueprint :
1/10 13:07:26:250 EDT] 000000aa StepStartBLA  A   CWWMH0300I: Starting business-level application "WebSphere:blaname=CounterApp".
[3/31/10 13:07:27:000 EDT] 000000aa webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Loading Web Module: CounterWebBundle.
[3/31/10 13:07:27:046 EDT] 000000aa WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Will create a new session context for application key default_hostCounterWebBundle
[3/31/10 13:07:27:062 EDT] 000000aa webcontainer  I com.ibm.ws.wswebcontainer.VirtualHost addWebApplication SRVE0250I: Web Module CounterWebBundle has been bound to default_host[*:9083,*:80,*:9446,*:5067,*:5066,*:443].
[3/31/10 13:07:27:078 EDT] 000000aa FileLocatorIm E   CWPST0164E: The CounterWebBundle composition unit is not found.
[3/31/10 13:07:27:093 EDT] 000000aa StepStartBLA  A   CWWMH0196I: Business-level application "WebSphere:blaname=CounterApp" was started successfully.
[3/31/10 13:07:27:109 EDT] 00000066 SystemOut     O WorldImpl.init() called
[3/31/10 13:07:27:109 EDT] 00000015 SystemOut     O CounterImpl.init() called
[3/31/10 13:07:27:125 EDT] 00000015 SystemOut     O GreetImpl.init() called
Note: Si la sortie de CounterImpl.init(), GreetImpl.init() et WorldImpl.init() ne s'affiche pas dans la sortie de console, cherchez dans la sortie les messages d'erreur lors du déploiement ou du démarrage de l'application, et vérifiez dans les fichiers Blueprint s'il existe des erreurs dans les définitions de service et bean.

Point de contrôle

Vous avez appris à utiliser l'injection de dépendance Blueprint pour permettre à un bean d'utiliser les services d'un autre.

Dans cette leçon, vous avez appris à utiliser une référence Blueprint pour configurer une injection de dépendance dans les bundles.
< Précédent | Suivant >
Icône indiquant le type de rubrique Rubrique de leçon de tutoriel
Dispositions pour les centres de documentation | Commentaires en retour

Icône d'horodatage Dernière mise à jour: May 29, 2014 10:11

Nom de fichier : counter_lesson8.html