Der Artikel Mit Spring und AOP Domänenklassen verwalten beschreibt, wie man Methoden des Repositorys in Domain-Klassen mit AOP verfügbar machen kann. Der grundlegende Gedanke ist, dass man das Repository selbst in ein Domain-Objekt injiziert.
Mir erscheint das aber irgendwie etwas umständlich, zumal es zumindest bei AOP per Proxy auch nicht gerade förderlich für die Performance ist. In dem erwähnten Artikel steht, dass es mit statischen Methoden Probleme geben würde, weil das angeblich der Testbarkeit und Dependency Injection zuwider laufen würde. Aber das sehe ich nicht so, denn man kann auch statische Felder über eine Methode von außen belegen.
Ausgangspunkt ist in meinem Beispiel die Domain-Klasse "Order", die mit statischen Methoden (bzw. hier nur einer statischen Methode) Funktionalitäten bereitstellt, die typischerweise in einem getrennten Service vorhanden sind.
Die Klasse Order verlässt sich zum Speichern auf diese Schnittstelle:
... und bekommt zur Laufzeit diese Implementierung injiziert:
Die Injektion läuft folgendermaßen ab:
Mir erscheint der Ansatz, die Klasse als Verwalter ihrer Instanzen zu verwenden, ziemlich nahe liegend und leicht nachvollziehbar.
Seht ihr Probleme mit diesem Ansatz?
Mir erscheint das aber irgendwie etwas umständlich, zumal es zumindest bei AOP per Proxy auch nicht gerade förderlich für die Performance ist. In dem erwähnten Artikel steht, dass es mit statischen Methoden Probleme geben würde, weil das angeblich der Testbarkeit und Dependency Injection zuwider laufen würde. Aber das sehe ich nicht so, denn man kann auch statische Felder über eine Methode von außen belegen.
Ausgangspunkt ist in meinem Beispiel die Domain-Klasse "Order", die mit statischen Methoden (bzw. hier nur einer statischen Methode) Funktionalitäten bereitstellt, die typischerweise in einem getrennten Service vorhanden sind.
Java:
class Order {
private static OrderRepository rep;
static void setOrderRepository(OrderRepository r){
rep = r;
}
static void findById(int id) {
rep.findById(id);
}
}
Die Klasse Order verlässt sich zum Speichern auf diese Schnittstelle:
Java:
interface OrderRepository {
void findById(int id);
}
... und bekommt zur Laufzeit diese Implementierung injiziert:
Java:
public class DefaultOrderRepository implements OrderRepository {
public void findById(int id) {
System.out.println(id + " gefunden");
}
}
Die Injektion läuft folgendermaßen ab:
Java:
public class Runner {
public static void main(String[] args){
Order.setOrderRepository(new DefaultOrderRepository());
Order.findById(12);
}
}
Mir erscheint der Ansatz, die Klasse als Verwalter ihrer Instanzen zu verwenden, ziemlich nahe liegend und leicht nachvollziehbar.
Seht ihr Probleme mit diesem Ansatz?
Zuletzt bearbeitet: