Frage zur Projektarchitektur

Hallo, ich habe wenig Erfahrung mit der Projektarchitektur von JavaEE Projekten und deshalb möchte ich euch fragen, ob der gewählte Weg von mir ok ist.

Ich erstelle für jede Anforderung, bspw. Datenbank, zwei Klassenbibliotheken. Die eine enthält die Schnittstellen und die andere die Implementierungen. Dadurch lässt sich die Implementierung jeder Zeit austauschen, ohne den Programmcode anderer Module anzupassen. Die Klassen zu den Schnittstellen werden mittels CDI erzeugt (inject). Es gibt aber auch Klassen, deren Erzeugung nicht über CDI stattfinden soll, dafür verwende ich Fabriken, die mit Hilfe von CDI injiziert werden.

Beispiel: database-interface.jar und database-implementation.jar
Die Schnittstellen in database-interface.jar sind:

Product, ProductFactory, ProductFacade.

ProductFacade wird injiziert.
Product wird über die ProductFactory erzeugt, da es mehrere Implementierungen gäbe könnte (UserDefault, UserDefaultMock, UserClient, UserJPA usw...).
Die ProductFactory wird injeziert. Von ihr gibt es verschiedene Implementierungen einmal für UserDefaultFactory, UserMockFactory ... . Die Factory, die verwendet wird, besitzt kein @alternative (oder alternative Eintrag in beans.xml).

Die Erzeugung von Product kann auch mit CDI über InitialContext.lookup geschehen. Ich finde, dass es aber unschön ist.

Ist diese Vorgehensweise gut?

Die Erzeugung von Product kann auch mit CDI über InitialContext.lookup geschehen. Ich finde, dass es aber unschön ist.

Ist diese Vorgehensweise gut?
 
Zuletzt bearbeitet:

KSG9|sebastian

Top Contributor
Hört sich für mich erstmal nach ziemlich vielen Abstraktionen an, die man nicht braucht?! Kommt natürlich auf den Anwendungsfall an, aber was ganz mies ist es, pauschal für jede Klasse ein Interface zu erzeugen. Am besten zuerst die Implementierung und dann "export interface/all methods", das braucht niemand.

Überleg dir, an welchen Stellen es WIRKLICH gewünscht ist, die Implementierung zu tauschen. Und überleg dir auch, anhand von schon laufenden Anwendungen, wie oft die Implementierung an einer gewissen Stelle ausgetauscht wurde und ob du wirklich Vorteile hattest, oder ob es ohne Interface genauso gegangen wäre.

Im Prinzip spricht aber nix gegen dein Vorgehen, aber du solltest trotzdem bei jedem Interface/jeder Implementierung prüfen, ob es wirklich benötigt wird. Wozu benötigst du eigentlich die Factories?

Du kannst doch auch zwei Implementierungen bauen (ich denke es geht um Test?!) und diese per @Qualifier/@Named bei deinen Tests injecten?

CDI macht im Hintergrund nichts anderes, als einen Lookup über den InitialContext auszulösen. Was gefällt dir daran nicht?

Gruß Sebastian

** edit **
Noch etwas zu Abstraktionen. Was ich schon soo oft gesehen habe war folgendes Konstrukt:
Code:
interface DataProvider {
}
interface DataConnector {
}

// Connector für Files
class FileConnector implements DataConnector {

}

// Connector für DB
class DBConnector implements DataConnector {

}

// für Zugriffe auf Daten in einer DB
class DatabaseDataProvider implements DataProvider{
   public DatabaseDataProvider(DataConnector connector) { ...}
}
// für Zugriffe auf Daten in einem File
class FileDataProvider implements DataProvider{
   public FileDataProvider(DataConnector connector) { .. }
}

In dem Beispiel gibt es zwei "Schichten". Einen Provider welcher Daten ermittelt und einen Connector, welcher dazu da ist, die Verbindung zu einer Resource aufzubauen.
Die findigen Entwickler dachten sich nun: Abstraktion ist etwas tolles, am besten auf jeder Ebene.
Durch dieses Konstrukt ist es nun aber möglich, einen DatabaseDataProvider mit einem FileConnector zu erzeugen, was absolut keinen Sinn macht. Die Abstraktion auf der Connector-Ebene ist an der Stelle erstmal unnötig, daher: Überleg dir, welche Abstraktionen wirklich nötig sind.

Nochmals an Inversion of Control denken: Der Client bestimmt die Schnittstelle/den Vertrag, nicht die Implementierung!
 
Zuletzt bearbeitet:
Danke :)

Ich möchte meine Enterprise-Application etwas verteilter entwickeln.Ein Server für die Datenbank (ejb mit Zugriff auf SQL-Server), Ein anderer für die Businesslogik und einer für das Web (Primefaces usw ...).

Im Prinzip spricht aber nix gegen dein Vorgehen, aber du solltest trotzdem bei jedem Interface/jeder Implementierung prüfen, ob es wirklich benötigt wird. Wozu benötigst du eigentlich die Factories?

Du kannst doch auch zwei Implementierungen bauen (ich denke es geht um Test?!) und diese per @Qualifier/@Named bei deinen Tests injecten?

Wenn ich mehrere Objkte von Product benötige, dann muss ich ja 50 Instanzen injizieren. Dazu sind die Factories gedacht. Ich injiziere eine Factory des benötigten Typs und rufe dann 50 createProduct() auf.
Product ist ein Entity auf dem Datenbankserver, aber auf dem Webserver soll nicht zu sehen sein, welche Annotationen verwendet wurden. Zudem wollte ich lazy-loading auf dem Webserver implementieren. Lazy-loading funktioniert leider nicht, wenn ich per jdni mir eine Entity vom Datenbankserver hole. Ich müsste die Entity einem EntityManager auf dem Webserver übergeben, der dann direkt auf den SQL-Server zugreift, das darf aber nicht sein (wegen cache + anderer Sicherheitsbereich).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm Frage zu karaf-Tutorium zum Programmieren von Service und Consumer Allgemeines EE 3
A Frage Umfang JEE Allgemeines EE 5
J Frage zu Dependecy Injection Allgemeines EE 10
pkm Frage zu Get- bzw. Postrequest in JSP. Allgemeines EE 1
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
Tort-E Grundsätzliche Frage -> Lokale Installation Allgemeines EE 2
E Frage zu Wildfly und Hibernate OGM Allgemeines EE 0
S Frage zu Jersey + Hibernate Allgemeines EE 1
Shams Frage zu Dowload von JAVA SDK Allgemeines EE 5
E Generelle Frage zu CDI mit JBoss AS 7.1.1 and Jave EE 6 Allgemeines EE 4
NoXiD JSF Frage zu Datenstruktur Allgemeines EE 2
S EJB Frage Allgemeines EE 10
2 Frage zu JNDI Allgemeines EE 13
E Entities im JSF/GUI-Layer, Frage zu 3-Layer-Model Allgemeines EE 2
G Allgemeine Frage zu Authentifizierung mittels Servlet API Allgemeines EE 2
B Wicket, Hibernate, H2 memDB Anfänger Frage Allgemeines EE 2
G Architektur- Frage Allgemeines EE 5
P Frage zu Java EE Design Patterns Allgemeines EE 3
M Frage zu Einloggen/Ausloggen - Features Allgemeines EE 4
M Frage zum Einsatz eines loggers Allgemeines EE 2
T Einstieg JEE: Frage für Frage bis zum Erfolg :-) Allgemeines EE 28
P Allg. Frage Eclipse EE & Xml Allgemeines EE 2
D Frage zum Statefull Session Beans Lebenszyklus Allgemeines EE 3
S JSTL / Spring Webflow Frage Allgemeines EE 2
S jsp include Frage Allgemeines EE 2
B Tomcat Manager - .war Datei hochladen. Einfache Frage Allgemeines EE 5
S Frage zu Taglib und Expression Language Allgemeines EE 5
B J2EE Frage Allgemeines EE 4
F Verständnis-Frage zu den vielen Frameworks Allgemeines EE 17
D Frage zum Verlassen eine JSF-Eingabefeldes Allgemeines EE 6
D Frage zu DataModel, DataModelSelection und Seam Allgemeines EE 3
H Frage zu JSF Allgemeines EE 5
G Generelle Java EE Frage zum Einstieg Allgemeines EE 3
M Allgemeine Frage zu Java Logging (JLA, Log4J) Allgemeines EE 5
N JSF - Frage zu Managed Beans und DataTable Allgemeines EE 4
S Frage zu JSF und MyFaces Komponenten: Teilbereiche neu laden Allgemeines EE 2
P Eine Frage zum Thema Applikationsaufbau Allgemeines EE 3
F [Hallo] Frage zu Hibernate Mapping und Vererbung Allgemeines EE 3
S allgemeine Frage zu Spring (AOP) Allgemeines EE 2
J Frage zu Jboss Allgemeines EE 7
G Anfänger-Frage: EJB Programmierung bzw. Konfiguration Allgemeines EE 6
M jsf Design Frage Allgemeines EE 3
J jsp:useBean Frage Allgemeines EE 4
megachucky JPA - Query.getResultList() Frage Allgemeines EE 3
M Hibernate Criteria frage Allgemeines EE 2
G Allgemeine Java Web Service Frage Allgemeines EE 4
1 Frage zu Struts und findForward Allgemeines EE 4
D Frage SSL und nicht SSL Allgemeines EE 3
E Warum geht das nicht (EL Frage)? Allgemeines EE 3
T Design/Performance-Frage beim servlet (static oder nicht) Allgemeines EE 35
E forEach Loop EL - Frage Allgemeines EE 2
G Design Frage Allgemeines EE 2
A EJB-Design Frage Allgemeines EE 2
F Frage zur guten Architektur einer WebApp Allgemeines EE 2
thE_29 Allg. Frage zu JSP/Servlets Allgemeines EE 2
flashfactor Frage zu Session-Lebensdauer Allgemeines EE 3
A Frage zu Servlets Allgemeines EE 5
P generelle Frage zum RequestDispatcher Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben