der kl@mmeraffe | ruby. java. development.

a developers guide to the world of code

Wednesday, December 21, 2005

Picocontainer

Picocontainer ist ein sogenannter IOC-Container. IOC steht für Inversion of Control und wurde (soweit ich informiert bin) von Martin Fowler vor einiger Zeit auf den Begriff Dependency Injection konkretisiert. Grundsätzlich bedeutet IOC, dass die Kontrolle für die Erstellung von abhängigen Objekten nicht mehr explizit sondern implizit gesteuert wird.

Beispiel:
public class KundeDAO {
[..]
Database db = new OracleDatabaseImpl();
[..]
}

In dieser Klasse ist die Verknüpfung zur Datenbankimplementierung fest, eine Wiederverwendung der Klasse wäre unter eines Deploys auf einem MSSQLServer problematisch. Falls eine Vielzahl kleiner Objekte viele Beziehungen zueinander aufbauen ist von einer losen Koppelung kaum noch zu sprechen.

Vereinfachend gehe ich jetzt nur auf zwei Arten von Dependency Injection ein

Möglichkeit 1:
Setter Injection

public class KundeDAO {
[..]
Database db;

public void setDatabase(Database db) {
this.db = db;
}
[..]
}


Möglichkeit 2:
Constructor Injection

public class KundeDAO {
[..]
Database db;

public KundeDAO(Database db) {
this.db = db;
}
[..]
}

Schauen wir uns in erster Linie Möglichkeit 2 an. Die Beziehungen (hier vereinfacht nur die Datenbank) werden übergeben, durch die Abstraktion zum Interface Database kann jede Form von Datenbank übergeben werden. Damit bleiben die Objekte lose gekoppelt und die Wiederverwendbarkeit steigt enorm.

Mit einem IOC-Container wie Picocontainer entfällt die direkte Verwaltung und Zuordnung der Beziehungen und die platz- und zeitraubende Instanzierung abhängiger Objekte, da der Container die Abhängigkeiten "injiziert" (daher Dependency Injection) und die Klassen selbst nicht mehr für die Erstellung verantwortlich sind.

Um das auf obiges Beispiel anzuwenden, würde ein Code-Snippet folgendermaßen aussehen:

MutablePicoContainer pico = new DefaultPicoContainer();
pico.registerComponentImplementation(OracleDatabaseImpl.class);
pico.registerComponentImplementation(KundeDAO.class);
KundeDAO kunde = (KundeDAO) pico.getComponentInstance(KundeDAO.class);

Hier werden einem neu erstellten PicoContainer die einzusetzenden Klassen übergeben und anschließend eine Instanz der KundeDAO-Klasse erstellt. Per Hand würde man das folgendermaßen abbilden:

Database database = new OracleDatabaseImpl();
KundeDAO kunde = new KundeDAO(database);

Bei einem so trivialen Beispiel wie hier macht das eher wenig Sinn. Wenn allerdings viele Klassen viele Abhängigkeiten untereinander haben ermöglicht Pico eine weniger starre Kopplung.

Soviel zur Einführung. Pico bietet auch Lifecycle-Support an und wirkt sehr sauber entwickelt (Test-First). Mehr Infos gibt es hier:

Picocontainer Homepage
Pico 5-Minuten Einführung

add to del.icio.us | submit to digg | submit to reddit

0 Comments:

Post a Comment

Links to this post:

Create a Link

<< Home