Wir haben viele DAOs in einem bestehenden Projekt (derzeit ohne Schnittstellen, aber das kann sich ändern). Anstatt Verdrahtung eines Feder Managed Bean für jede DAO-Klasse und in der Dienstschicht injizieren, haben wir eine DAO „Fabrik“ von Sorten, die wie folgt aussieht:Strategie für viele DAOs in Spring Java
public class DAOFactory {
private static DAOFactory daoFac;
static{
daoFac = new DAOFactory();
}
private DAOFactory(){}
public static DAOFactory getInstance(){
return daoFac;
}
public MyDAO1 getMyDAO1(){
return new MyDAO1();
}
public MyDAO2 getMyDAO2(){
return new MyDAO2();
}
...
(Beachten Sie, dass MyDAO1 und MyDAO2 konkrete Klassen sind)
Dies ermöglicht uns das einfache Hinzufügen/Aufrufen von DAO-Methoden innerhalb der Service-Schicht, ohne 1.) eine DAO-Schnittstelle als Eigenschaft der Serviceklasse hinzufügen 2.) die DAO-Implementierung über die Konfiguration in die Service-Methode einbinden. (Und wir verwenden manchmal mehrere DAOs in einer Serviceklasse).
DAOFactory.getInstance().getMyDAO1().doSomething();
Diese Strategie hat sich bisher für uns gearbeitet (wir haben für das Schalten Implementierungen viel Bedarf nicht hatte), aber ich frage mich, ob es eine bessere Methode ist, wenn wir neu anfangen konnten? Ich betrachtete das Autowiren der DAOs als Beans, aber ich müsste trotzdem Eigenschaften in jeder Serviceklasse erstellen, um die verwendeten DAOs darzustellen. Und in einem großen Projekt zögere ich ohnehin, mit der automatischen Verdrahtung von Beans zu beginnen - wir müssen Sichtbarkeit für alle Entwickler bereitstellen.
Es fühlt sich an, als wäre ich zwischen a.) Fest gekoppelt an eine Implementierung, aber weniger code/config overhead und b.) Lose an Schnittstellen gekoppelt, aber mit viel Code/Konfigurationsaufwand.
Gibt es einen besseren Weg, den ich vermisse? Irgendwas dazwischen? Meinungen wurden begrüßt.
Warum verwenden Sie Frühling, wenn Sie nicht tun wie Abhängigkeitsinjektion? Autowire die DAOs in den Serviceklassen: Genau darum geht es bei Sring und DI. Schreiben Sie dann einen Komponententest für Ihren Service, indem Sie ein Pseudo-DAO einwerfen und überlegen, wie viel einfacher es ist, es zu testen als mit einer statischen Fabrik. –
Wir haben eine Klasse, die derjenigen ähnlich ist, die Sie hier versuchen, aber wie JB Nizet erwähnt, haben wir die DAOs dazu gebracht. Eine wichtige Sache beim Autowiren der DAOs ist, dass Spring sie standardmäßig bei Singletons verwaltet, so dass Sie nicht viel Objekte erstellen können. Ihr Codebeispiel erstellt jedes Mal, wenn Sie ein bestimmtes DAO verwenden müssen, eine neue Kopie jedes DAO. Dies sollte nicht erforderlich sein. – Marvo
@JB Nizet: Wir verwenden DI viel, nur nicht für die DAOs. Ich bin nicht auf diese Methode gekommen, aber ich habe eine Chance, sie zu überarbeiten, daher die Frage. –