transparent

Home
Über uns
Kontakt

Meldungen
Links

transparent

Bücher
Artikel
Rezensionen
Poster
Vorträge

transparent

Architekturen &
  Muster

Performanz &
  Skalierbarkeit

EJB
CORBA
SOA


Fragen zu EJB 3.0 ?
Fragen Sie doch einfach ein Mitglied der EJB 3.0 Expert Group: Oliver Ihns. Einfach auf den rechts stehenden EMail-Link klicken.



Die EJB-Forumswebsite

[zum Forum...]

 

Unser EJB (3.0)-Glossar entzaubert und erklärt die vielen Buzzwords wie beispielsweise Inversion of Control, Configuration by Exception, POJO, POJI, Dependency Injection etc., die durch alle möglichen eZines und Printmedien geistern, und erklärt, was denn hinter den Buzzwords bzw. Begrifflichkeiten steckt.

::: WORK IN PROGRESS - Wir sind zurzeit dabei das Glossar aufzubauen, Stand 29.12.2005 :::

Copyright © 2005 by [objects-at-work] Oliver Ihns und Stefan M. Heldt
Dieses Glossar darf in vollständiger Form und unverändert jederzeit kopiert und kostenlos weitergegeben werden. Der Hinweis auf die Originalquelle http://www.objects-at-work.de/ejbglossar muß ebenso wie dieser Copyright-Hinweis stets angegeben werden. Es ist nicht zulässig das Glossar kommerziell zu vertreiben, gegen Entgeld weiterzugeben oder Inhalte zu verändern. Im Rahmen nicht-kommerzieller Verwendungen, beispielsweise Diplomarbeiten, darf das Glossar gerne übernommen werden. Die Verwendung in kommerziellen Zusammenhängen, beispielsweise in öffentlichen oder internen Schulungen, firmen-internen Netzwerken, Publikationen, Produkten etc. ist prinzipiell gestattet, wenn eine entsprechende Meldung an die folgend aufgeführte EMail-Adresse gesendet wird. Die Weitergabe ist sowohl in elektronischer als auch gedruckter Form zulässig. Im Internet zugängliche Kopien sind ebenfalls zu melden.

Hinweis zu den Urhebern der dargestellten Abbildungen: alle hierwidergegebenen Grafiken entstammen unseren eigenen Artikeln bzw. unserem Buch "Enterprise JavaBeans komplett" und sind NICHT von dritten bezogen!

Wenn Sie Begriffe vermissen, die Ihrer Meinung nach erklärt gehören oder bei Fragen, mailen Sie uns doch einfach unter
info@objects-at-work.de

Index

:A:   [nach oben - back to top]
Attached Object EJB 3.0 Bezeichnet eine vom Entity Manager aktuelle verwaltete Instanz einer Entity Bean mit den darin enthaltenen Daten aus einer Datenbank.
     
:B:   [nach oben - back to top]
Bean-Klasse

EJB 1.x
EJB 2.x
EJB 3.0

Die Bean-Klasse ist das Software-Artefakt einer EJB-Komponente, in der die eigentliche Implementierung der Geschäftslogik vorhanden ist. In der gängigen OO-Schreibweise würde man diese Klasse als Implementations-Klasse bezeichnen (z.B. KundeImpl). Im EJB-Bereich wird der Begriff Bean-Klasse verwendet (z.B. KundeBean).
Bean-managed Persistence EJB 2.x
EJB 3.0

Einer der beiden Persistenzmechanismen für Entity Beans vor EJB 3.0

Bei den Entity Beans, die Bean-Managed Persistence (BMP) verwenden, sind Sie als Entwickler dafür verantwortlich, diese Aufgabe durch Implementierung des entsprechenden Java-Codes zu lösen. Das bedeutet im Wesentlichen, dass der Entwickler die persistenten Attribute der Entity Bean in geeigneter Weise der Persistenzschicht (z.B. den Feldern einer Datenbanktabelle) zuordnen muss. Hierzu implementiert er die Logik für den Zugriff auf die Per-sistenzschicht (z.B. Datenbank per JDBC oder Legacy-System wie SAP per JCA ) in der Bean-Klasse.

  • Der EJB-Container entscheidet, wann etwas passiert.
  • Der Entwickler entschiedet, was passiert
BMP EJB 2.x
EJB 3.0
Akronym für Bean-managed Persistence
     
:C:   [nach oben - back to top]
Callback-Methoden EJB 2.x
EJB 3.0

Bei EJB 2.x wird bei der Implementierung der Bean-Klasse einer EJB-Komponente verlangt, dass eben diese Klassen entsprechend dem Typ der EJB-Komponente das entsprechende Callback Interface (javax.ejb.SessionBean, javax.ejb.MessageDrivenBean oder javax.ejb.EntityBean) implementiert. Zum einen kennzeichnen diese Interfaces, um was für einen Typ einer EJB es sich handelt. Zum anderen definieren diese Interfaces Callback Methoden, die vom EJB-Container im Lebenszyklus einer EJB-Komponente aufgerufen werden. Der Entwickler ist verpflichtet, die im jeweiligen Interface deklarierten Callback-Methoden in seiner Bean-Klasse zu implementieren.

Bei EJB 3.0 müssen die zuvor genannten Callback Interfaces nicht mehr von der Bean-Klasse implementiert werden. Da man nun nicht mehr gezwungen ist, die entsprechenden Callback-Methoden zu implementieren, führt dies zu einer Reduzierung von Entwicklungszeiten und -aufwänden. Um es zu ermöglichen, sich in den Ablauf der Steuerung des Lebenszyklus einer EJB-Komponente einzuklinken, gibt es ein Set von vordefinierten Meta-Annotationen. Diese erlauben, beliebige Methoden in der Bean-Klasse zu kennzeichnen, sodass diese in Abhängigkeit der verwendeten Meta-Annotation zu definierten Zeitpunkten aufgerufen werden. Angewendet werden können diese Meta-Annotationen auf alle EJB-Typen. Für das Einklinken in die Steuerung des Lebenszyklus von Session Beans und Message-driven Beans stehen die Meta-Annotationen @PostConstruct, @PreDestroy, @PostActivate und @PrePassivate zur Verfügung. Für das Einklinken in die Steuerung des Lebenszyklus von Entity Beans stehen folgende Meta-Annotationen zur Verfügung: @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpate, @PostLoad.

CMP EJB 2.x
EJB 3.0
Akronym für Container-managed Persistence
Component Interface EJB 1.x
EJB 2.x
EJB 3.0

Das Component Interface ist die Geschäftsschnittstelle einer EJB-Komponente. Diese kann es in zwei Ausprägungen geben: als lokale Schnittstelle (Zugriffe sind hierbei nur innerhalb des selben Prozesses möglich --> siehe Local Interface) und/oder als remote Schnittselle (hierbei können die Client über Rechner- und Prozessgrenzen hinweg auf die EJB-Komponente zugreifen --> siehe Remote Interface).

Configuration by Exception EJB 3.0  
Container-Managed Persistence EJB 2.x
EJB 3.0

Einer der beiden Persistenzmechanismen für Entity Beans vor EJB 3.0

Bei der Verwendung von Container-Managed Persistence (CMP) brauchen Sie als Entwickler die Logik zur Synchronisation zwischen Entity Beans und Persistenzschicht nicht zu implementieren. Sie wird durch Werkzeuge des Applikationsservers generiert. Die Aufgabe des Entwicklers beschränkt sich auf die Deklaration der persistenten Attributen sowie der Beziehungen zwischen Entity Beans. Die Synchronisation zur Laufzeit wird durch einen speziellen Teil des EJB-Containers - den sogenannten Persistenz-Manager - sichergestellt.

     
:D:   [nach oben - back to top]
DD

EJB 1.x
EJB 2.x
EJB 3.0

Akronym für Deployment Descriptor
Detached Object EJB 3.0 Bezeichnet eine vom Entity Manager losgelöste Entity Bean bzw. eine losgelöste Entität, die für gewöhnlich dann serialisiert zum Client transferiert wird und damit das DTO- oder VO-Pattern ersetzt.
Dependency Injection EJB 3.0

Der Begriff Dependency Injection (DI) ist eine spezialisierte Version des Inversion of Control-Musters. Martin Fowler hat diesen Begriff in http://martinfowler.com/articles/injection.html eingeführt, da die Charakteristik der Verwendung der Inversion of Control in den aktuell in den Medien stark vertretenen leichtgewichtigen Container/Frameworks eher den Charakter der Injektion von Referenzen über benötigte Objekte/Klasse hat.

Dependency Injection bedeutet konkret für die EJB-Technologie, dass der Entwickler zukünftig nicht mehr den Code für den Erhalt von Referenzen auf Ressourcen implementieren muss und die EJB-Komponente damit aktiv den sie umgebenden Container fragt, sondern der Entwickler nur noch per Meta-Annotation die Stellen in der EJB-Komponente "markiert", in die der EJB-Container von außen die gewünschten Referenzen in die EJB-Komponente injiziert.

Die Java EE 5.0 Spezifikation stellt dafür zukünftig eine normierte Meta-Annotation @Resource zur Verfügung. Anmerkung: im Zuge der noch nicht abgeschlossenen Entwicklung der EJB 3.0-Spezifikation gab es bereits verschiedene Meta-Annotationen (wie beispielsweise @Inject), die innerhalb der EJB 3.0-Spezifikation definiert worden sind. Diese sind aber im Zuge der Harmonisierung der Java EE-Plattform eliminiert worden. Dafür gibt es nun ein Java Standard-Package, in dem sich u.a. @Rescource befindet und welche eben dazu dient, den Java EE-Container dazu zu veranlassen die Referenz auf eine Ressource in die entsprechend annotierte Komponente (z.B. EJB-Komponente, Web Service, Servlet etc.) zu injizieren.

Deployment Descriptor EJB 1.x
EJB 2.x
EJB 3.0
Der Deployment Deskriptor enthält im XML-Format Laufzeit- und Kompilierungszeitinformationen für die Generierung und Ausführung von EJB-Komponenten. Hierbei handelt es sich um deklarative Programmierung, da der Entwickler Features/Funktionalitäten der EJB-Komponenten durch "einfaches" angeben bestimmter Schlüsselwörter innerhalb eines Deployment Deskriptors erreichen kann, ohne programmieren zu müssen. Beispielsweise lässt sich darüber die Transaktionalität von EJB-Komponenten steuern.
     
:E:   [nach oben - back to top]
EJB EJB 1.x
EJB 2.x
EJB 3.0
Akronym für Enterprise JavaBeans, der Bezeichnung des serverseitigen Komponentenmodells der Java EE-Plattform.
Embeddable Object EJB 3.0

Innerhalb einer EJB 3.0 Entity Bean können POJOs, die ihrerseits nicht als Entity Beans ge-kennzeichnet sind, in die Entity Bean eingebettet werden. Diese eingebetteten Objekte werden als "Embeddable Objects" bezeichnet. Gefüllt werden die Attribute der in eine Entity Bean eingebetteten Objekte aus den Spalten der Tabelle(n) mit der die Entity Bean assoziiert ist.

Es handelt sich hierbei beispielsweise um das Mappen einer Tabelle auf eine Entity Bean und darin eingebetteter weitere POJOs (einfacher Java-Klassen), um eine denormalisierte Tabelle auf ein Objektnetz zu projizieren.

Entity Bean mit dem Mapping auf ein Embeddable Object

@Entity
@Table(name = "KUNDE")
public class Kunde implements java.io.Serializable {
    private int id;
    private Adresse adresse;
    private String Name;
    private String Vorname;

    public Kunde(String name, String vorname, String strasse, String stadt) {
      this.adresse = new Adresse(strasse, stadt);
      this.name= name;
      this.vorname = vorname;
    }
    ...

    @Embedded
    @AttributeOverrides({
    @AttributeOverride(name = "strasse", column = @Column(name = "STRASSE")),
    @AttributeOverride(name = "stadt", column = @Column(name = "STADT")) })
    public Adresse getAdresse() {

       return adresse;
    }

    public void setAdresse(Adresse adresse) {
       this.adresse = adresse;
    }

    @Column(name = "NAME")
    public String getName() {
       return name;
    }

    public void setName(String name) {
       this.name = name;
    }
    ...
}


Embeddable Object

@Embeddable
public class Adresse implements java.io.Serializable {
    private String strasse;
    private String stadt;
    ...
}

     
Entity Manager EJB 3.0 Neues Element in der Java EE bzw. Java SE, welches mit EJB 3.0 eingeführt worden ist. Hierbei handelt es sich (analog zu Ansätzen aus JDO und Hibernate) um den zentralen Persistenzmanager. Der Entity Manager ist dafür zuständig, die gesamte Persistenzabbildung von Entitäten (POJOs) zur Verfügung zu stellen. Der Entity Manager kümmert sich um das persistente Neuanlegen von Entitäten in Datenbanken, das Laden, Speichern, Löschen, Suchen, und sorgt für die konsistenten Datenzustände bei konkurrierenden Zugriffen (Concurrency Handling) auf Entitäten.
     
:F:   [nach oben - back to top]
     
:G:   [nach oben - back to top]
     
:H:   [nach oben - back to top]
Home Interface EJB 1.x
EJB 2.x

Das Home Interface einer EJB-Komponente enthält alle Methoden zur Steuerung des Le-benszyklus der EJB-Komponente. Da Clients rein technisch keine Möglichkeiten besitzen, Instanzen von EJB-Komponenten über Rechner- und/oder Prozessgrenzen hinweg erzeugen, löschen oder laden zu können, müssen sie sich dazu an das jeweilige Home Interface der gewünschten EJB-Komponente wenden. Dieses stellt die entsprechenden Funktionalitäten zur Verfügung. Durch die Verwendung vom Home Interface wird eine Entkopplung von Clients und EJB-Komponenten erreicht. Das Home Interface entspricht dem Entwurfsmuster der "Factory Method".

Konkret gibt es von einem Home Interface zwei Varianten:

  • Remote Home Interface
    für entfernte Zugriffe über Rechner- und/oder Prozessgrenzen hinweg
  • Local Home Interface
    für lokale Kommunikation durch In-Prozess-Methodenaufrufe

     
:I:   [nach oben - back to top]
Interceptor EJB 3.0

Mit EJB 3.0 ist es möglich - analog CORBA-basierten Systemen, in denen Interceptor-Mechanismen seit langem bekannt sind und eingesetzt werden - Methodenaufrufe von Geschäftsmethoden abzufangen, die darin enthaltenen Parameterwerte zu untersuchen, bei Bedarf zu manipulieren und die Aufrufe weiterzuleiten oder bei Bedarf abzubrechen bzw. zu verhindern.

Mit dem Interceptor-Mechanismus hält die aspektorientierte Programmierung - zumindest in Ansätzen - Einzug in die EJB-basierte Entwicklung. Interceptors ermöglichen das transparente Einflechten von Funktionalitäten (z.B. Logging, Tracing, Zeitmessung, Sicherheitsprüfungen), die fachliche Entwickler von technischen Aspekten entkoppelt.

Der Entwickler eines Interceptors kann für eine abgefangene Methode innerhalb des aktivierten Interceptors beliebigen von ihm hinterlegten Code ausführen zu lassen.

Inversion of Control EJB 3.0

Inversion of Control (IoC) ist eine allgemeine Eigenschaft von Frameworks, wird gemeinhin gerne mit dem Satz "don't call us, we call you" umschrieben und soll ausdrücken, dass die Verantwortlichkeiten bei der Programmausführung beim Framework liegen und nicht bei den Komponenten, die auf Basis eines Frameworks entwickelt und ausgeführt werden.

D.h. das die Komponenten umgebende Framework verlangt von den Komponenten, dass bestimmte Callback-Methoden durch sie implementiert werden, über die das Framework bzw. der Container zur Laufzeit Informationen in die Komponenten injiziert ober bestimmtes Verhalten (über Methodenaufrufe) auslöst.

Im Kontext von EJB 3.0 wird IoC und Dependency Injection vielfach synonym verwendet, auch wenn es im Detail sehr wohl Unterschiede gibt (siehe hierzu auch Dependency Injection). Das, was bei EJB 3.0 zum Einsatz kommt, ist eine spezialisierte Form von Inversion of Control und wird als Dependency Injection bezeichnet.

     
:J:   [nach oben - back to top]
     
:K:   [nach oben - back to top]
     
:L:   [nach oben - back to top]
Local Home Interface EJB 2.x

Die lokale Variante des Home Interfaces ist das Local Home Interface. Es ist sozusagen die "Hochgeschwindigkeits-Variante" des Home Interfaces. Das Local Home Interface kommt ausschließlich dann zum Einsatz, wenn sich Client und zu rufende EJB-Komponente im selben EJB-Container (bzw. Prozess) befinden. Analog dem Remote Home Interface dient auch das Local Home Interface dazu, EJB-Komponenten erzeugen, löschen und ggf. laden zu lassen.

Das Local Home Interface ist "schlanker" als das Remote Home Interface, da es nicht über RMI angesprochen werden kann und keine Funktionalitäten für das Packen, Entpacken und Transferieren von Methodenaufrufen zum Transport über das Netzwerk zur Verfügung stellen muss. Die Kommunikation zwischen Client und EJB-Komponente erfolgt mittels In-Prozess-Methodenaufrufen und ist somit schneller als unter Verwendung eines Remote Home Interfaces. Das Local Home Interface ist nicht in der Lage, entfernte Methodenaufrufe zu empfangen.

<insert Grafik Local Home Interface>

Local Interface EJB 2.x
Die technische Ausprägung der Geschäftsschnittstelle (Component Interface) einer EJB-Komponente, die ausschließlich die lokale Kommunikation - die Kommunikation zwischen Client und EJB-Komponente erfolgt im selben Prozessraum - ermöglicht, wird als Local Interface bezeichnet. Wenn eine EJB-Komponente nur ein Local Interface besitzt, so ist es nicht möglich, dass ein Remote-Client auf die entfernte EJB-Komponete zugreifen kann.
     
:M:   [nach oben - back to top]
Managed Object EJB 3.0 Bezeichnet eine vom Entity Manager überwachte Entity Bean bzw. Entität. Überwacht bezieht sich hierbei auf die Steuerung des Persistenzverhaltens der Entität.
Multi-table Mapping EJB 3.0

Das Multi-table Mapping bezeichnet die Fähigkeit einer EJB 3.0 Entity Bean, auf mehrere physikalische (normalisierte) Datenbanktabellen gemappt zu werden. Diese Fähigkeit gab es in EJB 2.x - ohne expliziten Programmieraufwand - nicht. In EJB 3.0 ist eine Entity Bean kein stumpfes 1:1 Mapping einer Tabelle mehr, sondern vielmehr die technische Hülle für ein logisches Geschäftsobjekt, dessen Daten physikalisch über mehrere Tabellen verteilt sein können. Es wird innerhalb der Entity Bean über Annotationen einfach angegeben, aus welchen Tabellen/Feldern die entsprechenden Daten stammen. Der Entity Manager sorgt dafür, das relationale Modell zur Laufzeit aufzulösen und die Daten in die Entity Bean zu übertragen (siehe Abbildung).

Logisches Geschäftsobjekt (Entity Bean), bestehend aus drei Tabellen

@Entity
@Table(name = "KUNDE")
@SecondaryTables({
@SecondaryTable(name = "ADRESSE")
@SecondaryTable(name = "TYP") })

public class Kunde implements java.io.Serializable {
   private int id;
   private String name; // Aus Tabelle "KUNDE"
   private String vorname ; // Aus Tabelle "KUNDE"
   private String strasse; // Aus Sekundärtabelle "ADRESSE"
   ...

   // Attribut aus der Haupttabelle "Kunde"
   @Column(name = "NAME")  
   public String getName() {

     return name;
   }
   ...

   // Attribut aus der Sekundärtabelle "ADRESSE"
   @Column(name = "STRASSE", secondaryTable = "ADRESSE")
   public String getStrasse() {

     return strasse;
   }
   ...

   // Per Default wird, wenn kein @Column angeben ist,
   // davon ausgegangen, dass der Spaltenname gleich dem
   // Attributnamen ist.
   public String getVorname() {
     return vorname ;
   }
}

     
     
:N:   [nach oben - back to top]
     
:O:   [nach oben - back to top]
     
:P:   [nach oben - back to top]
Plain Old Java Interface EJB 3.0

Der Begriff taucht verstärkt seit 2004 in Fachzeitschriften und eZines im Java-Bereich auf. Mit Plain Old Java Interface bzw. POJI wird ein normales - nicht durch technischen oder infrastrukturellen Code verschmutztes - Java Interface bezeichnet.

Im Kontext von EJB 3.0 wird der Begriff Plain Old Java Interface bzw. POJI nun auch angewandt. Eine Kernidee von EJB 3.0 ist, dass die EJB-Komponenten aus Sicht des Entwicklers - in ihrer Nutzung und in ihrer Mikroarchitektur so weit vereinfacht werden, dass Component Interfaces (also die Geschäftsschnittstellen)

Plain Old Java Object EJB 3.0

Der Begriff taucht verstärkt seit 2004 ärkt in Fachzeitschriften und eZines im Java-Bereich auf. Mit Plain Old Java Object wird eine normale, einfache Java-Klasse (na ja, vielleicht sollte POJO dann lieber POJC heissen ;-) bezeichnet, die nicht durch infrastrukturellen Code, technische Code etc. "verschmutzt" ist, wie dies beispielsweise bei komplexeren Komponenten vorkommt.

Im Kontext von EJB 3.0 wird der Begriff Plain Old Java Object bzw. POJO nun auch angewandt. Eine Kernidee von EJB 3.0 ist, dass die EJB-Komponenten - aus Sicht des Entwicklers - in ihrer Nutzung und in ihrer Mikroarchitektur so weit vereinfacht werden, dass die Bean-Klassen (die Implementierungs-Klassen der EJB-Komponenten) von ihrem Typ her - im Vergleich zu EJB-Vorgängerversionen - als POJOs bezeichnet werden können.

POJO EJB 3.0 Akronym für Plain Old Java Object
POJI EJB 3.0 Akronym für Plain Old Java Interface
     
:Q:   [nach oben - back to top]
     
:R:   [nach oben - back to top]
Remote Home Interface EJB 1.x
EJB 2.x

Das Remote Home Interface ermöglicht es entfernten Clients, über das Netzwerk Anfragen zum Erzeugen, Laden und Löschen von Instanzen zu stellen. Clients kommunizieren mit einem Remote Home Interface über entfernte Methodenaufrufe, die über das RMI/IIOP-Protokoll transferiert werden. Diese Art der Kommunikation ist langsamer als die Kommunikation mittels In-Prozess-Methodenaufrufe innerhalb eines Prozesses. Die Verwendung dieser Ausprägung des Home Interfaces ist notwendig, wenn man Clients, die sich in einem verteilten System auf einem beliebigen Rechner in einem Netzwerk befinden können, eine EJB-Komponente offerieren möchte.

<insert Grafik Remote Home Interface>

Remote Interface EJB 1.x
EJB 2.x

Die technische Ausprägung der Geschäftsschnittstelle (Component Interface) einer EJB-Komponente, welche die Remote-Kommunikation (also entfernte Kommunikation) ermöglicht, wird als Remote Interface bezeichnet.

Wenn eine EJB-Komponente ein Remote Interface besitzt, ist es Clients in anderen Prozessräumen möglich über das Netzwerk und Rechner- und Prozessgrenzen hinweg auf eben diese EJB-Komponete zuzugreifen. Die Kommunikation erfolgt dabei über RMI/IIOP.

Selbst wenn sich Client und EJB-Komponente im selben Prozessraum befinden (z.B. ist der Client auch eine EJB-Komponente, die eine andere EJB-Komponente verwendet), und der Client die EJB-Komponente über ihr Remote Interface anspricht, so erfolgt die Kommunikation für gewöhnlich über RMI/IIOP, was in diesem Fall eine unnötige Verlangsamung der Zugriffs wäre, der durch zur Verfügungstellen einer lokalen Geschäftsschnittstelle (Local Interface) sehr einfach behoben werden kann und zu Performanzsteigerungen führt.

     
:S:   [nach oben - back to top]
     
:T:   [nach oben - back to top]
     
:U:   [nach oben - back to top]
     
:V:   [nach oben - back to top]
     
:W:   [nach oben - back to top]
     
:X:   [nach oben - back to top]
     
:Y:   [nach oben - back to top]
     
:Z:   [nach oben - back to top]
     
     

 

 

 

 

 

transparent

  
EJB 3.0-Kolumne im Javamagazin
!

Im Javamagazin gibt es seit Ausgabe 2/2005 die EJB 3.0-Kolumne von Oliver Ihns, in der er jeden Monat - bis zur finalen Version in 2006 - einen dedizierten Aspekt von EJB 3.0 beleuchtet. [mehr]


transparent

Das aktuelle Buch zu EJB 2.1.

Erschienen im Oldenbourg Wissenschafts-verlag. Vielfach eingesetzt in Praxis und Studium.

[mehr]


transparent

Siehe [Poster]

 


Impressum   "   Kontakt

© 2001-2005 [objects-at-work]