< Zurück | Weiter >

Lerneinheit 7: Abhängigkeitsinjektion zwischen Bundles hinzufügen

In der vorherigen Lerneinheit haben Sie gelernt, wie Sie Abhängigkeitsinjektion innerhalb eines Bundles verwenden. Für die Abhängigkeitsinjektion zwischen Bundles ist ein zusätzlicher Referenzeintrag in der Blueprint-Konfigurationsdatei erforderlich.

Bevor Sie mit dieser Lerneinheit beginnen, stoppen Sie den Server. Klicken Sie in der Ansicht "Server" (Fenster > Sicht anzeigen > Server) mit der rechten Maustaste auf WebSphere Application Server und wählen Sie Stoppen aus.

Bundleprojekt erstellen

Gehen Sie wie folgt vor, um ein Bundleprojekt zu erstellen und es einem OSGi-Anwendungsprojekt hinzuzufügen:
  1. Klicken Sie auf Datei > neu > Andere und blenden Sie dann OSGi ein.
  2. Klicken Sie auf OSGi-Bundle-Projekt und anschließend auf Weiter. Der Assistent "Neues OSGi-Bundle-Projekt" wird geöffnet.
  3. Geben Sie im Feld Projektname die Zeichenfolge CounterWorldBundle ein.
  4. Wählen Sie einen der folgenden Server aus der Liste "Ziellaufzeit" aus:
    • WebSphere Application Server Version 7.0
    • WebSphere Application Server Version 8.0
    • WebSphere Application Server Version 8.5
    • WebSphere Application Server Version 8.5 Liberty Profile
  5. Stellen Sie sicher, dass "CounterApp" im Feld Anwendungsprojekt angezeigt wird und klicken Sie dann auf Fertigstellen.

Service einem Bundle hinzufügen

In dieser Lerneinheit erstellen Sie einen einfachen Service mit dem Namen World, der eine Zeichenfolge aus der Methode World.getText() zurückgibt.
  1. Gehen Sie wie folgt vor, um das Paket zu erstellen:
    1. Blenden Sie im Enterprise-Explorer den Eintrag CounterWorldBundle ein.
    2. Klicken Sie mit der rechten Maustaste auf src und wählen Sie dann Neu > Paket aus. Der Assistent "Neues Java™-Paket" wird geöffnet.
    3. Geben Sie im Feld Name die Zeichenfolge com.ibm.ws.eba.world ein und klicken Sie dann auf Fertigstellen. Das Paket wird im Ordner src erstellt.
  2. Gehen Sie wie folgt vor, um die Schnittstellenklasse zu erstellen:
    1. Klicken Sie mit der rechten Maustaste auf das Paket com.ibm.ws.eba.world und anschließend auf Neu > Schnittstelle. Der Assistent "Neue Java-Schnittstelle" wird geöffnet.
    2. Geben Sie im Feld Name die Zeichenfolge World ein und klicken Sie auf Fertigstellen. Die Schnittstelle wird im Paket erstellt und im Editor geöffnet.
    3. Fügen Sie die Methode getText() der Schnittstelle hinzu. Daraus ergibt sich der folgende Code:
      package com.ibm.ws.eba.world;
      
      public interface World {
      	public String getText();
      }
    4. Speichern Sie die Datei World.java.
  3. Gehen Sie wie folgt vor, um die Implementierungsklasse zu erstellen:
    1. Klicken Sie mit der rechten Maustaste auf das Paket com.ibm.ws.eba.world und anschließend auf Neu > Klasse. Der Assistent "Neue Java-Klasse" wird geöffnet.
    2. Geben Sie im Feld Name die Zeichenfolge WorldImpl ein.
    3. Klicken Sie neben der Schnittstellenliste auf Hinzufügen. Der Auswahldialog "Implementierte Schnittstellen" wird geöffnet.
    4. Geben Sie im Feld Schnittstellen auswählen die Zeichenfolge World ein. Wählen Sie die Schnittstelle World für "com.ibm.ws.eba.world" aus und klicken Sie dann auf OK.
    5. Klicken Sie auf Fertigstellen. Die Klasse wird im Paket erstellt und im Editor geöffnet.
    6. Fügen Sie die Implementierung für die Methode getText() hinzu. Fügen Sie eine Initialisierungsmethode hinzu, die den Start des Service auf dem Server sicherstellt. Daraus ergibt sich der folgende Code:
      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. Speichern Sie die Datei WorldImpl.java.
  4. Gehen Sie wie folgt vor, um die Blueprint-Konfigurationsdatei zu erstellen:
    1. Klicken Sie mit der rechten Maustaste auf das Projekt CounterWorldBundle und wählen Sie Neu > Andere > OSGi > Blueprint-Datei aus und klicken Sie dann auf Weiter.
    2. Klicken Sie auf Fertigstellen. Die Blueprint-Konfigurationsdatei wird im Editor geöffnet.
  5. Fügen Sie der Blueprint-Konfigurationsdatei die Komponentenassemblierung- und -konfigurationsinformationen wie folgt hinzu:
    1. Klicken Sie im Editor auf der Registerkarte "Entwurf" auf Hinzufügen. Daraufhin wird der Dialog zum Hinzufügen von Elementen geöffnet.
    2. Klicken Sie auf Bean und anschließend auf OK. Die Bean wird Ihrer Konfiguration hinzugefügt.
    3. Gehen Sie wie folgt vor, um die Bean zu konfigurieren:
      • Geben Sie im Feld ID die Zeichenfolge WorldBean ein.
      • Klicken Sie im Feld Klasse auf Durchsuchen. Der Dialog "Typauswahl" wird geöffnet. Geben Sie im Feld Typnamen auswählen die Zeichenfolge WorldImpl ein und wählen Sie dann die Klasse WorldImpl aus. Klicken Sie auf OK.
      • Geben Sie im Feld Initialisierungsmethode die Zeichenfolge init ein.
    4. Klicken Sie auf Blueprint und anschließend auf Hinzufügen. Daraufhin wird der Dialog zum Hinzufügen von Elementen geöffnet.
    5. Klicken Sie auf Service und anschließend auf OK. Der Service wird Ihrer Konfiguration hinzugefügt.
    6. Konfigurieren Sie den Service wie folgt:
      • Geben Sie im Feld ID die Zeichenfolge WorldService ein.
      • Klicken Sie im Feld Schnittstelle auf Durchsuchen und wählen Sie die Schnittstelle World aus.
      • Klicken Sie im Feld Referenz auf Durchsuchen und wählen Sie anschließend Bean: WorldBean aus. Klicken Sie auf OK.
    7. Speichern Sie die Datei.
  6. Gehen Sie wie folgt vor, um das Paket zu exportieren:
    1. Blenden Sie CounterWorldBundle ein und klicken Sie dann doppelt auf Manifest: CounterWorldBundle, um die Bundlemanifestdatei im Editor zu öffnen.
    2. Wählen Sie das Register Laufzeit aus.
    3. Klicken Sie im Editor im Bereich "Exportierte Pakete" auf Hinzufügen. Daraufhin wird der Dialog "Exportierte Pakete" geöffnet.
    4. Klicken Sie in der Paketliste auf com.ibm.ws.eba.world und anschließend auf OK.
    5. Speichern Sie die Bundlemanifestdatei.

Bean für die Verwendung des neuen Service aktualisieren

Nachdem Sie den Service "World" implementiert haben, müssen Sie die Bean "GreetImpl" und die Bundlemanifestdatei "CounterServiceBundle" aktualisieren, damit Sie den Service "World" verwenden können.
  1. Gehen Sie wie folgt vor, um das Paket zu importieren:
    1. Blenden Sie im Enterprise-Explorer CounterServiceBundle ein und klicken Sie dann doppelt auf Manifest: CounterServiceBundle, um die Bundlemanifestdatei im Editor zu öffnen.
    2. Wählen Sie das Register Abhängigkeiten aus.
    3. Klicken Sie im Editor im Bereich "Importierte Pakete" auf Hinzufügen. Daraufhin wird der Dialog "Importierte Pakete" geöffnet.
    4. Klicken Sie in der Paketliste auf com.ibm.ws.eba.world und anschließend auf OK.
    5. Speichern Sie die Bundlemanifestdatei.
  2. Aktualisieren Sie die Datei GreetImpl.java:
    1. Blenden Sie im Enterprise-Explorer die Einträge CounterServiceBundle > src > com.ibm.ws.eba.counter ein und klicken Sie anschließend doppelt auf GreetImpl.java, um die Datei im Editor zu öffnen.
    2. Gehen Sie wie folgt vor, um die folgende Variablendeklaration hinzuzufügen und die Methode für die Bean "World" zu setzen:
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    3. Klicken Sie im Hauptmenü auf Quelle > Importe verwalten. Die fehlenden Importanweisungen werden Ihrem Code hinzugefügt.
    4. Aktualisieren Sie die Methode getText(), um den neuen Service aufzurufen:
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
      }
    5. Speichern Sie die Datei.
    Daraus ergibt sich der folgende Code:
    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");
      }
    
    }

Blueprint-Konfigurationsdatei aktualisieren

Damit der Blueprint-Container eine Instanz der Bean "World" in GreetImpl injizieren kann, müssen Sie die Referenz der Blueprint-Konfigurationsdatei hinzufügen.
  1. Blenden Sie die Einträge CounterServiceBundle > BundleContent > OSGI-INF > Blueprint ein und klicken Sie dann doppelt auf blueprint.xml, um die Blueprint-Konfigurationsdatei im Editor zu öffnen.
  2. Klicken Sie im Editor auf das Register "Entwurf" auf Blueprint und anschließend auf Hinzufügen. Daraufhin wird der Dialog zum Hinzufügen von Elementen geöffnet.
  3. Klicken Sie auf Referenz und anschließend auf OK. Daraufhin wird der Dialog "Referenzdetails" geöffnet.
  4. Gehen Sie wie folgt vor, um die Referenz zu konfigurieren:
    • Geben Sie im Feld Referenz-ID die Zeichenfolge WorldRef ein.
    • Klicken Sie im Feld Referenzschnittstelle auf Durchsuchen und wählen Sie anschließend die von Ihnen erstellte Schnittstelle World aus. Klicken Sie auf OK.
    • Klicken Sie auf OK, um die Änderungen zu übernehmen, und schließen Sie den Dialog.
    Die Referenz wird Ihrer Blueprint-Datei hinzugefügt.
  5. Klicken Sie im Bereich "Übersicht" auf den Knoten GreetBean (Bean) und anschließend auf Hinzufügen. Daraufhin wird der Dialog zum Hinzufügen von Elementen geöffnet.
  6. Klicken Sie auf Eigenschaft und anschließend auf OK.Die Eigenschaft wird Ihrer Konfiguration hinzugefügt.
  7. Gehen Sie wie folgt vor, um die Eigenschaft zu konfigurieren:
    • Geben Sie im Feld Name die Zeichenfolge worldBean ein.
    • Klicken Sie im Feld Referenz auf Durchsuchen. Der Dialog "Referenzauswahl" wird geöffnet. Klicken Sie auf Reference:WorldRef und anschließend auf OK.
  8. Speichern Sie die Datei.

Anwendung implementieren

  1. Blenden Sie im Enterprise-Explorer CounterWebBundle > CounterWebBundle > Servlets ein.
  2. Klicken Sie mit der rechten Maustaste auf CounterServlet und wählen Sie Ausführen als > Auf Server ausführen aus. Der Dialog "Auf Server ausführen" wird geöffnet.
  3. Klicken Sie auf Fertigstellen.

Die Zeichenfolge greet.getText()=0 Hello World! wird im Browser angezeigt. Der Wert erhöht sich mit jedem erneuten Laden der Seite.

Wechseln Sie zur Ansicht "Konsole" (Fenster > Sicht anzeigen > Konsole), um die Ausgabe vom Server anzuzeigen. Ein erfolgreiches Ergebnis zeigt die Ausgabe der Methoden CounterImpl.init(), GreetImpl.init() und WorldImpl.init() an, basierend auf den Initialisierungsmethodeneinträgen für die Beans CounterImpl, GreetImpl und WorldImpl in der Blueprint-Datei:
1/10 13:07:26:250 EDT] 000000aa StepStartBLA  A  CWWMH0300I: Die Geschäftsanwendung "WebSphere:blaname=CounterApp" wird gestartet.
[3/31/10 13:07:27:000 EDT] 000000aa webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Das Webmodul wird geladen: CounterWebBundle.
[3/31/10 13:07:27:046 EDT] 000000aa WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Es wird ein neuer Sitzungskontext für den Anwendungsschlüssel default_hostCounterWebBundle erstellt.
[3/31/10 13:07:27:062 EDT] 000000aa webcontainer  I com.ibm.ws.wswebcontainer.VirtualHost addWebApplication SRVE0250I: Das Webmodul CounterWebBundle wurde an default_host[*:9083,*:80,*:9446,*:5067,*:5066,*:443] gebunden.
[3/31/10 13:07:27:078 EDT] 000000aa FileLocatorIm E   CWPST0164E: Die Kompositionseinheit CounterWebBundle wurde nicht gefunden.
[3/31/10 13:07:27:093 EDT] 000000aa StepStartBLA  A   CWWMH0196I: Die Geschäftsanwendung "WebSphere:blaname=CounterApp" wurde erfolgreich gestartet.
[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
Anmerkung: Wenn die Ausgabe der Methoden CounterImpl.init(), GreetImpl.init() und WorldImpl.init() nicht in der Konsolenausgabe angezeigt werden, prüfen Sie die Ausgabe auf Fehlernachrichten, die während der Implementierung oder beim Starten der Anwendung aufgetreten sein können. Prüfen Sie anschließend die Blueprint-Dateien auf mögliche Fehler in den Bean- oder Servicedefinitionen.

Prüfpunkt für Lerneinheit

Sie haben erfahren, wie Sie die Blueprint-Abhängigkeitsinjektion einsetzen, damit eine Bean die Services einer anderen Bean verwenden kann.

In dieser Lerneinheit haben Sie erfahren, wie Sie eine Blueprint-Referenz zu Konfiguration einer Abhängigkeitsinjektion zwischen Bundles verwenden.
< Zurück | Weiter >
Symbol das den Typ des Artikels anzeigt. Artikel für Lerneinheit
Nutzungsbedingungen für Information Center | Feedback

Symbol für Zeitmarke Letzte Aktualisierung: 29.04.2014

Dateiname: counter_lesson8.html