Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 7 Angewandte Objektorientierung
Pfeil 7.1 Schnittstellen in der Anwendung
Pfeil 7.1.1 CharSequence als Beispiel einer Schnittstelle
Pfeil 7.1.2 Die Schnittstelle Iterable
Pfeil 7.1.3 Funktionszeiger
Pfeil 7.2 Design-Pattern (Entwurfsmuster)
Pfeil 7.2.1 Motivation für Design-Pattern
Pfeil 7.2.2 Das Beobachter-Pattern (Observer/Observable)
Pfeil 7.2.3 Ereignisse über Listener
Pfeil 7.3 Service-Factory
Pfeil 7.3.1 Arbeiten mit dem ServiceLoader
Pfeil 7.3.2 Utility-Klasse Lookup als ServiceLoader-Fassade
Pfeil 7.4 JavaBean
Pfeil 7.4.1 Properties (Eigenschaften)
Pfeil 7.4.2 Einfache Eigenschaften
Pfeil 7.4.3 Indizierte Eigenschaften
Pfeil 7.4.4 Gebundene Eigenschaften
Pfeil 7.4.5 Veto-Eigenschaften – dagegen!


Galileo Computing - Zum Seitenanfang

7.3 Service-Factory Zur nächsten ÜberschriftZur vorigen Überschrift

Je größer eine Java-Anwendung wird, desto größer werden die Abhängigkeiten zwischen Klassen und Typen. Um die Abhängigkeiten zu reduzieren, ist zunächst gewünscht, sich nicht so sehr an Implementierungen zu binden, sondern an Schnittstellen. (Das gelobte »Programmieren gegen Schnittstellen und nicht gegen eine Implementierung.«) Eine Schnittstelle beschreibt dann Dienste, so genannte Services, auf die an anderer Stelle zurückgegriffen werden kann. Die nächste Frage ist, wie ein Service mit Geschäftslogik zu der Stelle kommt, an denen er benötigt wird, etwa auf der grafischen Oberfläche als Aktion hinter einer Schalt-fläche. Hier haben sich zwei Wege herausgestellt:

  • Service-Fabriken. Eine Service-Fabrik ist eine Zentrale, an die sich Interessenten wenden, wenn sie einen Service nutzen wollen. Die Fabrik liefert eine passende Implementierung, die immer eine Service-Schnittstelle implementiert. Welche Realisierung – also konkrete Klasse – die Fabrik liefert, soll den Nutzer nicht interessieren; eben Programmieren gegen Schnittstellen.
  • Dependency Injection/Inversion of Control (IoC). Nach diesem Prinzip fragen die Interessenten nicht aktiv über eine zentrale Service-Fabrik nach den Diensten, sondern den Interessenten wird der Service über eine übergeordnete Einheit gegeben (injiziert). Die magische Einheit nennt sich IoC-Container. In der Vergangenheit hat sich das Spring-Framework als De-facto-Standard eines IoC-Containers herauskristallisiert.

Galileo Computing - Zum Seitenanfang

7.3.1 Arbeiten mit dem ServiceLoader Zur nächsten ÜberschriftZur vorigen Überschrift

Java SE bietet bisher keine Bibliothek für Dependency Injection, aber mit der Klasse java.util.ServiceLoader eine einfache Realisierung für Service-Fabriken. Ein eigenes Programm soll auf einen Grüßdienst zurückgreifen, aber welche Implementierung das sein wird, soll an anderer Stelle entschieden werden.

Listing 7.14 com/tutego/insel/services/ServiceLoaderDemo, main()

ServiceLoader<Greeter> greeterServices = ServiceLoader.load( Greeter.class ); 
for ( Greeter greeter : greeterServices ) 
  System.out.println( greeter.getClass() + " : " + greeter.greet( "Chris" ) );

ServiceLoader erfragt mit load() eine Realisierung, die die Schnittstelle Greeter implementieren soll. Die Realisierung ist der Service-Provider. Greeter deklariert eine greet()-Operation:

Listing 7.15 com/tutego/insel/services/Greeter.java

package com.tutego.insel.services; 
public interface Greeter 
{ 
  String greet( String name ); 
}

Der Service liefert aber eine konkrete Klasse. Demnach muss es irgendwo eine Zuordnung geben, die einen Typnamen (Greeter) mit einer konkreten Klasse, der Service-Implementierung, verbindet. Dazu ist im Wurzelverzeichnis des Klassenpfades ein Order META-INF mit einem Unterordner services anzulegen. In diesem Unterordner ist eine Textdatei (provider configuration file) zu setzen, die den gleichen Namen wie die Service-Schnittstelle besitzt:

META-INF/ services/ com.tutego.insel.services.Greeter

Diese Textdatei, die keine Dateiendung aufweist, enthält Zeilen mit voll qualifizierten Klassennamen (binary name genannt) für die Implementierung, die später hinter diesem Service stehen. Es kann eine Zeile oder durchaus mehrere Zeilen für unterschiedliche Implementierungen angegeben sein:

Listing 7.16 META-INF/services/com.tutego.insel.services.Greeter

com.tutego.insel.services.FrisianGreeter

FrisianGreeter ist demnach unsere letzte Klasse und eine tatsächliche Implementierung des Services:

Listing 7.17 com/tutego/insel/services/FrisianGreeter.java

package com.tutego.insel.services; 
 
public class FrisianGreeter implements Greeter 
{ 
  @Override public String greet( String name ) 
  { 
    return "Moin " + name + "!"; 
  } 
}

Galileo Computing - Zum Seitenanfang

7.3.2 Utility-Klasse Lookup als ServiceLoader-Fassade topZur vorigen Überschrift

So nett der ServiceLoader auch ist, die API könnte ein wenig kürzer sein. Denn oftmals gibt es nur eine Service-Implementierung und nicht gleich mehrere. Daher soll eine Fassade eine knackigere API anbieten. Eine kurze Methode lookup() liefert genau den ersten Service (oder null), und lookupAll() gibt alle Service-Klassen in einer Sammlung zurück. (Das Listing nutzt mehrere Dinge, die die Insel bisher nicht vorgestellt hat! Dazu zählen Generics, Datenstrukturen, Iterator, Meta-Objekte.)

Listing 7.18 com/tutego/insel/services/Lookup.java, Lookup

public class Lookup 
{ 
  public static <T> T lookup( Class<T> clazz ) 
  { 
    Iterator<T> iterator = ServiceLoader.load( clazz ).iterator(); 
    return iterator.hasNext() ? iterator.next() : null; 
  } 
 
  public static <T> Collection<? extends T> lookupAll( Class<T> clazz ) 
  { 
    Collection<T> result = new ArrayList<T>(); 
    for ( T e : ServiceLoader.load( clazz ) ) 
      result.add( e ); 
    return result; 
  } 
}

Die Nutzung vereinfacht sich damit:

Listing 7.19 com/tutego/insel/services/LookupDemo.java, main()

System.out.println( Lookup.lookup( Greeter.class ).greet( "Chris" ) ); // Moin Chris! 
System.out.println( Lookup.lookupAll( Greeter.class ).size() );        // 1


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de