< Zurück | Weiter >

Lerneinheit 6: Abhängigkeitsinjektion innerhalb eines Bundles hinzufügen

Mithilfe der Abhängigkeitsinjektion kann eine Bean auf eine andere Bean zugreifen, ohne einen Code für die Erstellung der Bean-Instanz implementieren zu müssen. Die erforderliche Bean-Instanz wird vom Blueprint-Container unter Verwendung der in der Blueprint-Konfigurationsdatei enthaltenen Informationen erstellt.

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.
Gehen Sie wie folgt vor, um Abhängigkeitsinjektion innerhalb eines Bundles hinzuzufügen:
  1. Service einem Bundle hinzufügen
  2. Blueprint-Konfigurationsdatei aktualisieren
  3. Servlet für Aufruf des neuen Service aktualisieren
  4. Anwendung implementieren

Service einem Bundle hinzufügen

  1. Gehen Sie wie folgt vor, um die Schnittstellenklasse zu erstellen:
    1. Blenden Sie im Enterprise-Explorer die Einträge CounterServiceBundle > src ein.
    2. Klicken Sie mit der rechten Maustaste auf com.ibm.ws.eba.counter und wählen Sie anschließend Neu > Schnittstelle aus. Der Assistent "Neue Java™-Schnittstelle" wird geöffnet.
    3. Geben Sie im Feld Name die Zeichenfolge Greet ein und klicken Sie auf Fertigstellen. Die Schnittstelle wird im Paket erstellt und im Editor geöffnet.
    4. Fügen Sie den Prototyp getText() zur Schnittstelle hinzu. Daraus ergibt sich der folgende Code:
      package com.ibm.ws.eba.counter;
      
      public interface Greet {
      		public String getText();
      }
  2. Gehen Sie wie folgt vor, um die Implementierungsklasse zu erstellen:
    1. Klicken Sie mit der rechten Maustaste auf com.ibm.ws.eba.counter und wählen Sie anschließend Neu > Klasse aus. Der Assistent "Neue Java-Klasse" wird geöffnet.
    2. Geben Sie im Feld Name die Zeichenfolge GreetImpl 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 Greet ein. Wählen Sie die Schnittstelle Greet aus und klicken Sie anschließend auf OK.
    5. Klicken Sie auf Fertigstellen. Die Klasse wird im Paket erstellt und im Editor geöffnet.
    6. Ersetzen Sie die Klasse GreetImpl durch die folgende Implementierung:
      package com.ibm.ws.eba.counter;
      
      public class GreetImpl implements Greet {
      	
      	private Counter counter;
      	
      	public void setCounter(Counter c) {
      		counter = c;
      	}
      
      	@Override
      	public String getText() {
      		return counter.getCount()+" Hello";
      	}
      	
      	public void init() {
      		System.out.println("GreetImpl.init() called");
      	}
      
      }
    7. Speichern Sie die Datei GreetImpl.java.
Die private Variable counter referenziert eine Instanz des Zählerservice, die vom Container über die Abhängigkeitsinjektion initialisiert wird. Sie wird mit der Methode setCounter festgelegt.

Blueprint-Konfigurationsdatei aktualisieren

Gehen Sie wie folgt vor, um die Blueprint-Konfigurationsdatei zu konfigurieren, damit der Service "Greet" gestartet und eine Instanz des Zählerservice injiziert werden kann:
  1. Klicken Sie im Enterprise-Explorer mit der rechten Maustaste auf CounterServiceBundle und wählen Sie dann OSGi > Blueprint-Datei öffnen aus, um die Blueprint-Datei im Editor zu öffnen.
  2. Fügen Sie der Blueprint-Konfigurationsdatei die Komponentenassemblierung- und -konfigurationsinformationen wie folgt hinzu:
    1. 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.
    2. Klicken Sie auf Bean und anschließend auf OK. Daraufhin wird der Dialog für die Beandetails geöffnet.
    3. Gehen Sie wie folgt vor, um die Bean zu konfigurieren:
      1. Geben Sie im Feld Bean-ID die Zeichenfolge GreetBean ein.
      2. Klicken Sie im Feld Klasse auf Durchsuchen. Der Dialog "Typauswahl" wird geöffnet. Geben Sie im Feld Typnamen auswählen die Zeichenfolge GreetImpl ein und wählen Sie dann die Klasse GreetImpl aus. Klicken Sie auf OK.
      3. Klicken Sie auf OK, um die Änderungen zu übernehmen, und schließen Sie den Dialog.
      4. Geben Sie im Editor im Feld Initialisierungsmethode die Zeichenfolge init ein.
      Die Bean wird Ihrer Blueprint-Datei hinzugefügt.
    4. Klicken Sie im Bereich "Übersicht" auf GreetBean (Bean) und klicken Sie dann auf Hinzufügen. Daraufhin wird der Dialog zum Hinzufügen von Elementen geöffnet.
    5. Klicken Sie auf Eigenschaft und anschließend auf OK.
    6. Gehen Sei wie folgt vor, um die Eigenschaft zu konfigurieren:
      • Geben Sie im Feld Name die Zeichenfolge counter ein.
      • Klicken Sie im Feld Referenz auf Durchsuchen. Der Dialog "Referenzauswahl" wird geöffnet. Klicken Sie auf Bean: CounterBean und anschließend auf OK.
    7. Klicken Sie im Bereich "Übersicht" auf Blueprint und anschließend auf Hinzufügen.
    8. Klicken Sie auf Service und anschließend auf OK. Daraufhin wird der Dialog "Servicedetails" geöffnet.
    9. Konfigurieren Sie den Service wie folgt:
      1. Klicken Sie im Feld Serviceschnittstelle auf Durchsuchen und wählen Sie dann die Schnittstelle Greet aus.
      2. Klicken Sie im Feld Beanreferenz auf Durchsuchen und wählen Sie dann Bean: GreetBean aus. Klicken Sie auf OK.
      3. Klicken Sie auf OK, um die Änderungen zu übernehmen, und schließen Sie den Dialog.
      Der Service wird Ihrer Konfiguration hinzugefügt.
  3. Speichern Sie die Datei.

Servlet für Aufruf des neuen Service aktualisieren

  1. Blenden Sie im Enterprise-Explorer die Einträge CounterWebBundle > Java-Ressourcen > src > com.ibm.ws.eba.servlet ein.
  2. Klicken Sie doppelt auf die Datei CounterServlet.java, um sie im Editor zu öffnen.
  3. Lokalisieren Sie die Methode doGet() und ersetzen Sie sie durch die folgende Implementierung:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Greet greet;
    		try {
    			InitialContext ic = new InitialContext();
    			greet = (Greet) ic.lookup("osgi:service/"+Greet.class.getName());
    			response.getOutputStream().println("greet.getText()="+greet.getText());
    		} catch (NamingException e) {
    			e.printStackTrace(System.out);
    		}
    	}
  4. Klicken Sie im Hauptmenü auf Quelle > Importe verwalten. Die Importanweisungen werden aktualisiert.
  5. Speichern Sie die Datei CounterServlet.java.

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 wird vom 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() und GreetImpl.init() an, basierend auf den Initialisierungsmethodeneinträgen für die Beans CounterImpl und GreetImpl in der Blueprint-Datei:
[3/30/10 16:59:41:734 EDT] 00000072 StepStartBLA  A   CWWMH0300I: Die Geschäftsanwendung "WebSphere:blaname=CounterApp" wird gestartet.
[3/30/10 16:59:42:406 EDT] 00000072 webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Das Webmodul wird geladen: CounterWebBundle.
[3/30/10 16:59:42:453 EDT] 00000072 WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Es wird ein neuer Sitzungskontext für den Anwendungsschlüssel default_hostCounterWebBundle erstellt.
[3/30/10 16:59:42:468 EDT] 00000072 webcontainer  I com.ibm.ws.wswebcontainer.VirtualHost addWebApplication SRVE0250I: Das Webmodul CounterWebBundle wurde an default_host[*:9083,*:80,*:9446,*:5067,*:5066,*:443] gebunden.
[3/30/10 16:59:42:468 EDT] 00000072 FileLocatorIm E   CWPST0164E: Die Kompositionseinheit CounterWebBundle wurde nicht gefunden.
[3/30/10 16:59:42:500 EDT] 00000072 StepStartBLA  A   CWWMH0196I: Die Geschäftsanwendung "WebSphere:blaname=CounterApp" wurde erfolgreich gestartet.
[3/30/10 16:59:42:500 EDT] 00000016 SystemOut     O CounterImpl.init() called
[3/30/10 16:59:42:500 EDT] 00000016 SystemOut     O GreetImpl.init() called
Anmerkung: Wenn die Ausgabe der Methoden CounterImpl.init() und GreetImpl.init() nicht in der Konsolenausgabe angezeigt wird, 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 folgende Inhalte gelernt:
  • Code für eine Bean schreiben, die eine andere Bean verwendet
  • Eigenschaft in der Blueprint-Konfigurationsdatei definieren, über die der Blueprint-Container angewiesen wird, die Variable durch Abhängigkeitsinjektion zu initialisieren
< 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_lesson7.html