Ecco un'introduzione a ciascuna tecnologia menzionata.
Spring-DAO
Spring-DAO non è un modulo spring in senso stretto, ma piuttosto convenzioni che dovrebbero imporre di scrivere DAO e di scriverli bene. In quanto tale, non fornisce interfacce, implementazioni o modelli per accedere ai dati. Quando si scrive un DAO, è necessario annotarli con in @Repository
modo che le eccezioni collegate alla tecnologia sottostante (JDBC, Hibernate, JPA, ecc.) Siano tradotte in modo coerente nella DataAccessException
sottoclasse appropriata .
Ad esempio, supponiamo che ora stai utilizzando Hibernate e il tuo livello di servizio cattura HibernateException
per reagire ad esso. Se si passa a JPA, le interfacce DAO non dovrebbero cambiare e il livello di servizio verrà comunque compilato con blocchi che catturano HibernateException
, ma non si inseriranno mai questi blocchi poiché i DAO ora lanciano JPA PersistenceException
. Usando @Repository
sul tuo DAO, le eccezioni legate alla tecnologia sottostante vengono tradotte in Spring DataAccessException
; il tuo livello di servizio rileva queste eccezioni e se decidi di cambiare la tecnologia di persistenza, la stessa primavera DataAccessExceptions
verrà comunque lanciata poiché la primavera ha tradotto le eccezioni native.
Si noti tuttavia che questo ha un utilizzo limitato per i seguenti motivi:
- Di solito non dovresti intercettare le eccezioni di persistenza, poiché il provider potrebbe aver annullato la transazione (a seconda del sottotipo di eccezione esatto) e quindi non dovresti continuare l'esecuzione con un percorso alternativo.
- La gerarchia delle eccezioni è solitamente più ricca nel tuo provider rispetto a quella fornita da Spring e non esiste una mappatura definitiva da un provider all'altro. Affidarsi a questo è pericoloso. Questa è comunque una buona idea con cui annotare i DAO
@Repository
, poiché i bean verranno aggiunti automaticamente dalla procedura di scansione. Inoltre, Spring può aggiungere altre utili funzionalità all'annotazione.
Spring-JDBC
Spring-JDBC fornisce la classe JdbcTemplate, che rimuove il codice idraulico e ti aiuta a concentrarti sulla query e sui parametri SQL. Devi solo configurarlo con a DataSource
, quindi puoi scrivere codice come questo:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC fornisce anche un JdbcDaoSupport, che puoi estendere per sviluppare il tuo DAO. Fondamentalmente definisce 2 proprietà: un DataSource e un JdbcTemplate che possono essere utilizzati entrambi per implementare i metodi DAO. Fornisce inoltre un traduttore delle eccezioni dalle eccezioni SQL alle Spring DataAccessExceptions.
Se prevedi di usare jdbc semplice, questo è il modulo che dovrai usare.
Primavera-ORM
Spring-ORM è un modulo ombrello che copre molte tecnologie di persistenza, ovvero JPA, JDO, Hibernate e iBatis. Per ciascuna di queste tecnologie, Spring fornisce classi di integrazione in modo che ciascuna tecnologia possa essere utilizzata seguendo i principi di configurazione di Spring e si integra senza problemi con la gestione delle transazioni di Spring.
Per ogni tecnologia, la configurazione consiste fondamentalmente nell'iniettare un DataSource
bean in una sorta di bean SessionFactory
o EntityManagerFactory
altro. Per JDBC puro, non sono necessarie tali classi di integrazione (a parte JdbcTemplate), poiché JDBC si basa solo su un DataSource.
Se prevedi di utilizzare un ORM come JPA o Hibernate, non avrai bisogno di spring-jdbc, ma solo di questo modulo.
Spring-Data
Spring-Data è un progetto ombrello che fornisce un'API comune per definire come accedere ai dati (DAO + annotazioni) in un modo più generico, coprendo sia le origini dati SQL che NOSQL.
L'idea iniziale è quella di fornire una tecnologia in modo che lo sviluppatore scriva l'interfaccia per un DAO (metodi finder) e le classi di entità in modo indipendente dalla tecnologia e, in base alla sola configurazione (annotazioni su DAO e entità + configurazione a molla, sia essa xml o java-based), decide la tecnologia di implementazione, sia essa JPA (SQL) o redis, hadoop, ecc. (NOSQL).
Se si seguono le convenzioni di denominazione definite da spring per i nomi dei metodi finder, non è nemmeno necessario fornire le stringhe di query corrispondenti ai metodi finder per i casi più semplici. Per altre situazioni, devi fornire la stringa di query all'interno delle annotazioni sui metodi finder.
Quando il contesto dell'applicazione viene caricato, spring fornisce proxy per le interfacce DAO, che contengono tutto il codice boilerplate relativo alla tecnologia di accesso ai dati e richiama le query configurate.
Spring-Data si concentra su tecnologie non SQL, ma fornisce comunque un modulo per JPA (l'unica tecnologia SQL).
Qual è il prossimo
Sapendo tutto questo, ora devi decidere cosa scegliere. La buona notizia qui è che non è necessario fare una scelta finale definitiva per la tecnologia. È qui che risiede il potere di Spring: come sviluppatore, ti concentri sul business quando scrivi codice e, se lo fai bene, cambiare la tecnologia sottostante è un dettaglio di implementazione o configurazione.
- Definire un modello di dati con classi POJO per le entità e metodi get / set per rappresentare gli attributi dell'entità e le relazioni con altre entità. Avrai sicuramente bisogno di annotare le classi ei campi di entità in base alla tecnologia, ma per ora i POJO sono sufficienti per iniziare. Per ora concentrati solo sui requisiti aziendali.
- Definisci le interfacce per i tuoi DAO. 1 DAO copre esattamente 1 entità, ma certamente non avrai bisogno di un DAO per ciascuna di esse, poiché dovresti essere in grado di caricare entità aggiuntive navigando nelle relazioni. Definire i metodi di ricerca seguendo rigide convenzioni di denominazione.
- Sulla base di ciò, qualcun altro può iniziare a lavorare sul livello dei servizi, con mock per i tuoi DAO.
- Impari le diverse tecnologie di persistenza (sql, no-sql) per trovare la soluzione migliore per le tue esigenze e scegli una di esse. Sulla base di ciò, annoti le entità e implementa i DAO (o lascia che spring li implementi per te se scegli di utilizzare spring-data).
- Se i requisiti aziendali si evolvono e la tua tecnologia di accesso ai dati non è sufficiente a supportarla (ad esempio, hai iniziato con JDBC e alcune entità, ma ora hai bisogno di un modello di dati più ricco e JPA è una scelta migliore), dovrai cambiare l'implementazione dei tuoi DAO, aggiungi alcune annotazioni sulle tue entità e modifica la configurazione della molla (aggiungi una definizione EntityManagerFactory). Il resto del codice aziendale non dovrebbe subire altri impatti dalla modifica.
Nota: gestione delle transazioni
Spring fornisce un'API per la gestione delle transazioni. Se prevedi di utilizzare spring per l'accesso ai dati, dovresti utilizzare anche spring per la gestione delle transazioni, poiché si integrano molto bene. Per ciascuna tecnologia di accesso ai dati supportata dalla primavera, esiste un gestore delle transazioni corrispondente per le transazioni locali, oppure puoi scegliere JTA se hai bisogno di transazioni distribuite. Tutti implementano la stessa API, in modo che (ancora una volta) la scelta tecnologica sia solo una questione di configurazione che può essere modificata senza ulteriori impatti sul codice aziendale.
Nota: documentazione di primavera
I collegamenti alla documentazione di Spring che hai citato sono piuttosto vecchi. Ecco la documentazione dell'ultima versione (4.1.6, che copre tutti gli argomenti):
Spring-data non fa parte del framework Spring. C'è un modulo comune che dovresti prima leggere per abituarti ai principi. La documentazione può essere trovata qui: