Abbiamo molti DAO in un progetto esistente (attualmente senza interfacce, ma che può cambiare). Piuttosto che il cablaggio di un bean gestito a molla per ogni classe DAO e iniettando loro nel livello di servizio, abbiamo una DAO "fabbrica" di sorta che assomiglia a questo:Strategia per molti DAO nella primavera del 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();
}
...
(Si noti che MyDAO1 e MyDAO2 sono classi concrete
Questo ci consente di aggiungere/chiamare facilmente metodi DAO all'interno del livello Servizio, senza dover 1.) aggiungere un'interfaccia DAO come proprietà alla classe di servizio 2.) collegare l'implementazione DAO al metodo di servizio tramite la configurazione. (E a volte utilizziamo più DAO in una classe di servizio).
DAOFactory.getInstance().getMyDAO1().doSomething();
Questa strategia ha funzionato per noi finora (non abbiamo avuto bisogno di molto per il passaggio implementazioni), ma mi chiedo se c'è un metodo migliore se siamo stati in grado di iniziare di nuovo? Ho guardato i autowiring DAO i fagioli, ma mi piacerebbe ancora bisogno di creare proprietà di ogni classe di servizio per rappresentare quei DAO utilizzati. E in un grande progetto, io sono riluttanti a iniziare fagioli auto-cablaggio in ogni caso - abbiamo bisogno di fornire visibilità per tutti gli sviluppatori.
Sembra come se flip-flopping tra a.) Essendo strettamente accoppiato a un'implementazione, ma meno overhead di codice/config e b.) Essendo accoppiato liberamente alle interfacce, ma richiedendo un sacco di sovraccarico di codice/configurazione.
C'è un modo migliore che mi manca? Qualcosa in mezzo? Opinioni accolte
Perché usate primavera se non lo fai come l'iniezione di dipendenza? Basta scovare i DAO nelle classi di servizio: ecco cosa sono Sring e DI. Quindi scrivi un test unitario per il tuo servizio iniettando un DAO simulato e considera quanto è più facile provarlo che con una fabbrica statica. –
Abbiamo una classe simile a quella che stai provando qui, ma come menziona JB Nizet, abbiamo inserito i DAO in esso. Una cosa fondamentale nell'autowiring dei DAO è che Spring li gestisce in Singletons per impostazione predefinita, quindi non si otterrà molta creazione di oggetti. L'esempio di codice crea una nuova copia di ogni DAO ogni volta che è necessario utilizzare un determinato DAO e non dovrebbe esserci alcuna necessità. – Marvo
@JB Nizet: Usiamo l'abbondanza DI, non solo per i DAO. Non ho ideato questo metodo, ma ho la possibilità di rielaborarlo, da qui la domanda. –