dependency injection in der praxis: picocontainer, spring ... ?· dependency injection in der...

Download Dependency Injection in der Praxis: PicoContainer, Spring ... ?· Dependency Injection in der Praxis:…

Post on 04-Jun-2018

212 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • http://www.it-agile.de/

    Dependency Injection in der Praxis:Spring, PicoContainer und Eclipse im Vergleich

    Dipl.-Informatiker Martin LippertSenior IT-Berater

    martin.lippert@it-agile.de

  • JFS - 07.07.2005 http://www.it-agile.de/ 2

    berblick

    MotivationDependency Injection

    Was ist das?Wie funktioniert das?

    Dependency-Injection-Frameworks im Vergleich:PicoContainerSpringEclipse

    Fazit

  • JFS - 07.07.2005 http://www.it-agile.de/ 3

    Motivation

    Unsere Software wollen wir gut modularisieren... leicht verndern knnen einfach testen knnen

    Was finden wir aber in der Praxis?Viele AbhngigkeitenEng verzahnte SystemteileWenig definierte SchnittstellenEvil Singletons

  • JFS - 07.07.2005 http://www.it-agile.de/ 4

    Klassiker: Direkte Erzeugung

    Es werden Interfaces benutzt, aber die Implementation wird trotzdem direkt erzeugt

    public class MovieLister {private MovieFinder finder;

    public MovieLister() {finder = new ColonDelimitedMovieFinder("movies1.txt");

    }

    ...}

  • JFS - 07.07.2005 http://www.it-agile.de/ 5

    Klassiker: Singleton

    Gerne und hufig genutztes, aber in Verruf geratenes Pattern

    Typische Probleme:

    Singletons sind schwer zu testenSingletons auf dem Server sind durch die J2EE-Spezifikation verbotenSingletons auf dem Server mssen Thread-Safe programmiert seinDynamischer Austausch der Implementierung schwierig, z.B. fr Tests mit Mock-Types (EasyMock)

  • JFS - 07.07.2005 http://www.it-agile.de/ 6

    Dependency Injection

    Abhngigkeiten explizit machen!!!Separate Configuration from Use!!!

    Mit dem Dependency-Injection-Muster werden die Abhngigkeiten zwischen den Objekten von auen gesteuert

    Die hufigsten zwei Varianten:Constructor InjectionSetter InjectionInterface Injection

  • JFS - 07.07.2005 http://www.it-agile.de/ 7

    Constructor Injection

    An der Schnittstelle (z.B. im Konstruktor) werden die bentigten Objekte mitgegeben

    public class MovieLister {private MovieFinder finder;

    public MovieLister(MovieFinder finder) {this.finder = finder;

    }

    ...

    }

  • JFS - 07.07.2005 http://www.it-agile.de/ 8

    Setter Injection

    Die Klasse besitzt Setter, um anhngige Komponenten bekannt zu machen

    public class MovieLister {private MovieFinder finder;

    public void setFinder(MovieFinder finder) {this.finder = finder;

    }

    ...}

  • JFS - 07.07.2005 http://www.it-agile.de/ 9

    Interface Injection

    Es wird ein Interface definiert, um die Injection zu kennzeichnen

    public interface InjectFinder {void injectFinder(MovieFinder finder);

    }

    Die entsprechenden abhngigen Klasssen implementieren das Interface

    public class MovieLister implements InjectFinder...public void injectFinder(MovieFinder finder) {

    this.finder = finder;}

  • JFS - 07.07.2005 http://www.it-agile.de/ 10

    Folgen

    Probleme:1. Das Objekt, das das betroffene Objekt erzeugt, muss alle Objekte, die dieses

    braucht, kennen. 2. Das fhrt zum Durchschleifen von Parametern und langen Parameterlisten.

    Ein Objekt bekommt alles, was es braucht, gesetzt (z.B. im Konstruktor).

    DesktopTool

    GespraechsnotizAufnahmeTool

    KundenkartenAufnahmeTool

    setKundenfabrik(fabrik)

    setKundenfabrik(fabrik)

  • JFS - 07.07.2005 http://www.it-agile.de/ 11

    Abhilfe: Dependency-Injection-Frameworks

    Bei Dependency-Injection-Frameworks wird die Erzeugung fast aller Objekte von einer anderen Instanz erledigt, die alle bentigten Objekte kennt oder wei, wie diese zu erzeugen sind.

    Verwalter von Singletons:Diese erzeugen ein neues Exemplar falls noch keines vom geforderten Typ vorhanden ist und geben dann immer dieses eine Exemplar zurck. Diese knnen dazu verwendet werden die Objekte zu verwalten, die bisher als Singletons verfgbar waren.

    Verwalter gewhnlicher Objekte:Diese geben immer neue Objekte heraus und knnen dort verwendet werden, wo bisher ber einen Konstruktoraufruf neue Objekte erzeugt wurden.

  • JFS - 07.07.2005 http://www.it-agile.de/ 12

    Open-Source-Frameworks

    PicoContainerhttp://picocontainer.codehaus.org/

    Springhttp://www.springframework.org/

    Eclipsehttp://www.eclipse.org/

    Weitere?HivemindNanoContainer

  • JFS - 07.07.2005 http://www.it-agile.de/ 13

    PicoContainer: Konstruktion der Klassen

    Die Klassen, von denen der PicoContainer Objekte erzeugen soll, mssen einen Konstruktor haben, der als Parameter alles aufnimmt, was von dem Objekt spter gebraucht wird.

    public class KundenFabrik{public KundenFabrik(PersistenceConfiguration config){assert config != null :

    Precondition: config != null;_persistenceConfiguration = config;

    }}

    Der PicoContainer wird diesen Konstruktor aufrufen. Wenn er die bentigten Objekte noch nicht hat, wird er sie erzeugen.

    Wenn es mehr als einen Konstruktor gibt, nimmt der PicoContainer den grten den er befllen kann.

    Empfehlung: Nur einen Konstruktor.

    Der PicoContainer wird diesen Konstruktor aufrufen. Wenn er die bentigten Objekte noch nicht hat, wird er sie erzeugen.

    Wenn es mehr als einen Konstruktor gibt, nimmt der PicoContainer den grten den er befllen kann.

    Empfehlung: Nur einen Konstruktor.

  • JFS - 07.07.2005 http://www.it-agile.de/ 14

    PicoContainer: Registrierung

    An einem PicoContainer knnen Klassen und Objekte registriert werden.

    picoContainer.registerComponentImplementation(KundenFabrik.class);

    picoContainer.registerComponentImplementation(altDatenAltDatenService.class);

    AndereFabrik fabrik = new AndereFabrik(test);picoContainer.registerComponentInstance(fabrik);

    Registriert eine Klasse, von der bei Bedarf ein Objekt erzeugt wird

    Registriert eine Klasse, von der bei Bedarf ein Objekt erzeugt wird

    Registriert ein vorkonfiguriertes Exemplar mit seiner Klasse als Key.

    Registriert ein vorkonfiguriertes Exemplar mit seiner Klasse als Key.

    Registriert eine Klasse unter einem bestimmten Key.

    Registriert eine Klasse unter einem bestimmten Key.

  • JFS - 07.07.2005 http://www.it-agile.de/ 15

    PicoContainer: Abfrage von Objekten

    Von einem PicoContainer knnen Objekte abgeholt werden.

    KundenFabrik kundenFabrik = (KundenFabrik) picoContainer.getComponentInstanceOfType(KundenFabrik.class);

    AltDatenService service = (AltDatenService) picoContainer.getComponentInstance(altDaten);

    Holt eine Exemplar anhand des Typs.Bercksichtigt Vererbung und Interfaces.

    Holt eine Exemplar anhand des Typs.Bercksichtigt Vererbung und Interfaces.

    Holt eine Exemplar anhand eines Key.Holt eine Exemplar anhand eines Key.

  • JFS - 07.07.2005 http://www.it-agile.de/ 16

    PicoContainer: Erzeugung von PicoContainern

    Ein PicoContainer wird bei der Erzeugung konfiguriert.

    MutablePicoContainer pc1 = new DefaultPicoContainer();

    MutablePicoContainer pc2 = new DefaultPicoContainer(newConstructorInjectionComponentAdapterFactory());

    Erzeugt einen PicoContainer, der Singletons verwaltet

    Erzeugt einen PicoContainer, der Singletons verwaltet

    Erzeugt einen PicoContainer, der jedes Mal ein neues Exemplar erzeugt

    Erzeugt einen PicoContainer, der jedes Mal ein neues Exemplar erzeugt

  • JFS - 07.07.2005 http://www.it-agile.de/ 17

    PicoContainer: Eltern-Beziehung

    MutablePicoContainer pc1 = new DefaultPicoContainer();

    MutablePicoContainer pc2 = new DefaultPicoContainer(newConstructorInjectionComponentAdapterFactory(), pc1);

    pc1 ist Parent von pc2. Wenn ein Objekt, das von pc2 erzeugt wird, ein Singleton braucht, das in pc1 registriert ist, wird pc2 pc1 nach diesem Objekt fragen und es bekommen.

    Dadurch lassen sich Hierarchien von PicoContainern mit verschiedenen Aufgabenbereichen erzeugen.

    Der Parent eines PicoContainers kann nach der Konstruktion nicht mehr gendert werden und ein PicoContainer kann nur einen Parent haben.

    pc1 ist Parent von pc2. Wenn ein Objekt, das von pc2 erzeugt wird, ein Singleton braucht, das in pc1 registriert ist, wird pc2 pc1 nach diesem Objekt fragen und es bekommen.

    Dadurch lassen sich Hierarchien von PicoContainern mit verschiedenen Aufgabenbereichen erzeugen.

    Der Parent eines PicoContainers kann nach der Konstruktion nicht mehr gendert werden und ein PicoContainer kann nur einen Parent haben.

  • JFS - 07.07.2005 http://www.it-agile.de/ 18

    UBIServiceProvider

    PicoContainer: Aus einem Projekt

    ToolComponentManager

    ToolsPicoContainer

    ServicesPicoContainer

    parent

    SingletonPicoContainer

    parent

    UBI

  • JFS - 07.07.2005 http://www.it-agile.de/ 19

    Spring: berblick

    Leichtgewichtiges Opensource-J2EE FrameworkZiel: Entwicklung von J2EE-Anwendungen vereinfachen (z.B. im Vergl. zu EJB) Integriert existierenden Technologien statt eigener LsungenUnabhngig vom eingesetzten Application ServerAnwendungscode ist (meist) nicht von Spring APIs abhngig Erste Version im Oktober 2003 erschienen, aktuell Version 1.2.1Modularer Aufbau aus unabhngig einsetzbaren Paketen

  • JFS - 07.07.2005 http://www.it-agile.de/ 20

    Spring: Pakete

    Spring Core: Basisinfrastruktur, Untersttzung fr Beans, DISpring AOP: Untersttzung fr deklarative DiensteSpring DAO: DB-Zugriff mit JDBC oder DAOsSpring ORM: Integration von Hibernate, JDO Spring Transaction: Untersttzung fr Transaktions Management Spring Web: Anbindung an bestehende Frontend-Technologien (Struts, JSF, )Spring MVC: Eigenes Web-Framework

  • JFS - 07.07.2005 http://www.it-agile.de/ 21

    Spring: Pakete

    Spring Core: Basisinfrastruktur, Untersttzung fr Beans