Ho sentito molto parlare di Spring , la gente dice in tutto il web che Spring è un buon framework per lo sviluppo web. A cosa serve esattamente Spring Framework?
Ho sentito molto parlare di Spring , la gente dice in tutto il web che Spring è un buon framework per lo sviluppo web. A cosa serve esattamente Spring Framework?
Risposte:
Fondamentalmente la primavera è un quadro per iniezione di dipendenza che è un modello che consente di costruire sistemi molto disaccoppiati.
Ad esempio, supponiamo di dover elencare gli utenti del sistema e quindi dichiarare un'interfaccia chiamata UserLister
:
public interface UserLister {
List<User> getUsers();
}
E forse un'implementazione che accede a un database per ottenere tutti gli utenti:
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
A tuo avviso dovrai accedere a un'istanza (solo un esempio, ricorda):
public class SomeView {
private UserLister userLister;
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Si noti che il codice sopra non ha inizializzato la variabile userLister
. Cosa dovremmo fare? Se istanzio esplicitamente l'oggetto in questo modo:
UserLister userLister = new UserListerDB();
... Abbinerei la vista alla mia implementazione della classe che accede al DB. E se volessi passare dall'implementazione del DB a un altro che ottiene l'elenco utenti da un file separato da virgole (ricorda, è un esempio)? In tal caso, tornerei al mio codice e cambierei la riga sopra in:
UserLister userLister = new UserListerCommaSeparatedFile();
Questo non ha alcun problema con un piccolo programma come questo ma ... Cosa succede in un programma che ha centinaia di visualizzazioni e un numero simile di business class? La manutenzione diventa un incubo!
Ciò che Spring fa è collegare le classi utilizzando un file XML o annotazioni, in questo modo tutti gli oggetti vengono istanziati e inizializzati da Spring e iniettati nei posti giusti (Servlet, Web Frame, Business class, DAO, ecc., Ecc., Ecc. ...).
Tornando all'esempio in primavera, dobbiamo solo avere un setter per il userLister
campo e avere un file XML come questo:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
o più semplicemente annota l'archivio nella nostra classe di visualizzazione con @Inject
:
@Inject
private UserLister userLister;
In questo modo, quando la vista viene creata magicamente, sarà UserLister
pronta per funzionare.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
È grande! No?
UserLister
interfaccia? Basta cambiare l'XML.UserLister
pronta un'implementazione? Programmare un'implementazione fittizia temporale UserLister
e facilitare lo sviluppo della vista.Ci sono altre opzioni per Dependency Injection lì intorno, ciò che secondo me ha reso Spring così famosa oltre alla sua semplicità, eleganza e stabilità è che i ragazzi di SpringSource hanno programmato molti POJO che aiutano a integrare Spring con molti altri framework comuni senza essere invadente nella tua applicazione. Inoltre, Spring ha molti buoni sottoprogetti come Spring MVC, Spring WebFlow, Spring Security e ancora una lista di eccipienti.
Spero che sia di aiuto. Ad ogni modo, ti incoraggio a leggere l'articolo di Martin Fowler su Iniezione di dipendenza e Inversione di controllo perché lo fa meglio di me. Dopo aver compreso le nozioni di base, dai un'occhiata alla documentazione di primavera , secondo me, è usato per essere il miglior libro di primavera di sempre.
Spring contiene ( come giustamente Skaffman ha sottolineato ) un framework MVC. Per spiegare in breve ecco i miei input. Spring supporta la separazione del livello di servizio, del livello Web e del livello aziendale, ma ciò che fa davvero meglio è "l'iniezione" di oggetti. Quindi, per spiegare che con un esempio considera l'esempio seguente:
public interface FourWheel
{
public void drive();
}
public class Sedan implements FourWheel
{
public void drive()
{
//drive gracefully
}
}
public class SUV implements FourWheel
{
public void drive()
{
//Rule the rough terrain
}
}
Ora nel tuo codice hai una classe chiamata RoadTrip come segue
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Ora ogni volta che vuoi un'istanza di Trip; a volte potresti volere un SUV per inizializzare FourWheel o a volte potresti volere Berlina. Dipende davvero da cosa vuoi in base alla situazione specifica.
Per risolvere questo problema, dovresti avere un modello di fabbrica come modello di creazione. Dove una fabbrica restituisce l'istanza giusta. Quindi alla fine finirai con un sacco di codice colla solo per istanziare correttamente gli oggetti. La primavera fa il meglio del codice colla senza quel codice colla. Dichiarate i mapping in XML e inizializza automaticamente gli oggetti. Funziona molto anche usando l'architettura singleton per istanze e ciò aiuta a ottimizzare l'utilizzo della memoria.
Questo è anche chiamato Inversion Of Control. Altri framework per fare questo sono Google Guice, container Pico ecc.
A parte questo, Spring ha un framework di validazione, ampio supporto per il livello DAO in collaborazione con JDBC, iBatis e Hibernate (e molti altri). Fornisce un eccellente controllo transazionale sulle transazioni del database.
C'è molto di più in Spring che può essere letto in buoni libri come "Pro Spring".
Anche i seguenti URL possono essere di aiuto.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article .tss? l = Spring Framework
Ai vecchi tempi, Spring era un frame di iniezione delle dipendenze che funzionava solo come ( Guice , PicoContainer , ...), ma al giorno d'oggi è una soluzione totale per la creazione della tua applicazione aziendale .
L'iniezione di dipendenza primaverile, che è, ovviamente, il cuore della primavera è ancora lì (e puoi rivedere altre buone risposte qui), ma ce ne sono altre dalla primavera ...
La primavera ha ora molti progetti, ognuno con alcuni sottoprogetti ( http://spring.io/projects ). Quando qualcuno parla della primavera, devi scoprire di quale progetto primaverile sta parlando, è solo il nucleo primaverile, che è noto come quadro di primavera , o è un altro progetto primaverile.
Alcuni progetti primaverili che meritano di essere menzionati sono:
Se hai bisogno di alcune funzionalità più specifiche per la tua applicazione, potresti trovarle anche lì:
Ci sono anche alcuni piccoli progetti lì per esempio primavera-social-facebook ( http://projects.spring.io/spring-social-facebook/ )
Puoi usare spring per lo sviluppo web in quanto ha il Spring MVC
modulo che fa parte del progetto Spring Framework . Oppure puoi usare spring con un altro framework web, come struts2 .
A cosa serve la primavera? Risponderò a breve a questa domanda, ma prima diamo un'occhiata all'esempio di victor hugo. Non è un grande esempio perché non giustifica la necessità di un nuovo framework.
public class BaseView {
protected UserLister userLister;
public BaseView() {
userLister = new UserListerDB(); // only line of code that needs changing
}
}
public class SomeView extends BaseView {
public SomeView() {
super();
}
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Fatto! Quindi ora anche se hai centinaia o migliaia di visualizzazioni, devi solo cambiare una riga di codice, come nell'approccio Spring XML. Ma cambiare una riga di codice richiede ancora la ricompilazione invece di modificare l'XML che dici? Bene amico mio pignolo, usa Ant e lo script via!
Allora, a cosa serve la primavera? È per:
Ulteriori letture: http://discuss.joelonsoftware.com/?joel.3.219431.12
UserLister
), ma cosa succede se ha bisogno di più servizi, non condivisi tra i diversi BaseView
figli? Non c'è (fortunatamente) nessuna eredità multipla in Java.
La primavera è tre cose.
Il problema è che Spring DI è davvero ben congegnato, gli involucri intorno ad altre cose sono davvero ben pensati in quanto le altre cose hanno pensato a tutto e Spring lo ha avvolto bene. Le implementazioni Spring di MVC e REST e tutte le altre cose non sono così ben fatte (YMMV, IMHO) ma ci sono eccezioni (Spring Security è da bombe). Quindi tendo a usare Spring per DI e i suoi fantastici wrapper ma preferisco altre cose per il Web (mi piace molto Tapestry), REST (Jersey è davvero robusto), ecc.
Cosa vorresti probabilmente in un'applicazione web con Spring -
Inoltre, Spring è ENORME - quindi ci sono molte altre cose che potresti essere interessato a utilizzare in un'app Web come Spring AOP o Spring Security. Ma le quattro cose sopra elencate descrivono i componenti comuni di Spring utilizzati in un'app Web.
Vedo due parti per questo:
Si noti che è possibile utilizzare perfettamente Spring in un'applicazione Web senza utilizzare Spring MVC. Direi che la maggior parte delle applicazioni web Java lo fa, mentre usa altri framework web come Wicket, Struts, Seam, ...
La primavera è ottima per incollare insieme esempi di classi. Sai che le tue classi Hibernate avranno sempre bisogno di un'origine dati, Spring le collega insieme (e ha anche un'implementazione dell'origine dati).
I tuoi oggetti di accesso ai dati avranno sempre bisogno dell'accesso di ibernazione, Spring collega le classi di ibernazione nei tuoi DAO per te.
Inoltre, Spring ti offre fondamentalmente configurazioni solide di un gruppo di librerie e, in questo, ti guida in quali librerie dovresti usare.
La primavera è davvero un ottimo strumento. (Non stavo parlando di Spring MVC, solo del framework di base).
La risposta accettata non comporta l'utilizzo delle annotazioni poiché Spring ha introdotto il supporto per varie annotazioni per la configurazione.
C'è un altro modo per collegare le classi insieme a un file XML: le annotazioni. Usiamo l'esempio della risposta accettata e registrare il fagiolo direttamente sulla classe utilizzando uno dei annotazioni @Component
, @Service
, @Repository
o @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
In questo modo quando la vista viene creata magicamente avrà un UserLister pronto a funzionare.
L'affermazione sopra è valida con un piccolo bonus che non richiede l'uso di file XML e il cablaggio con un'altra annotazione @Autowired
che trova un'implementazione pertinente e la inserisce.
@Autowired
private UserLister userLister;
Utilizzare l' @Bean
annotazione su un metodo utilizzato per ottenere l'implementazione del bean da iniettare.
@Bean
annotazione a livello di classe. Deve essere uno dei @Component
, @Service
, @Repository
ecc resto è corretto. Dovresti forse anche sottolineare che Autowiring the Interface in questo modo funzionerà solo se esiste solo 1 classe candidata in classpath adatta per l'iniezione, altrimenti errore dell'applicazione Spring.
Il vantaggio è l' iniezione di dipendenza (DI) . Significa esternalizzare il compito di creare oggetti. Lasciatemi spiegare con un esempio.
public interface Lunch
{
public void eat();
}
public class Buffet implements Lunch
{
public void eat()
{
// Eat as much as you can
}
}
public class Plated implements Lunch
{
public void eat()
{
// Eat a limited portion
}
}
Ora nel mio codice ho una lezione LunchDecide come segue:
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(){
this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
//this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion
}
}
Nella classe sopra, a seconda del nostro umore, scegliamo Buffet () o Plated (). Tuttavia, questo sistema è strettamente accoppiato. Ogni volta che abbiamo bisogno di un diverso tipo di oggetto, dobbiamo cambiare il codice. In questo caso, commentando una riga! Immagina che ci siano 50 classi diverse utilizzate da 50 persone diverse. Sarebbe un casino infernale. In questo caso, dobbiamo disaccoppiare il sistema. Riscriviamo la classe LunchDecide.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Si noti che invece di creare un oggetto utilizzando una nuova parola chiave, abbiamo passato il riferimento a un oggetto di Tipo pranzo come parametro per il nostro costruttore. Qui, la creazione di oggetti è esternalizzata. Questo codice può essere cablato utilizzando il file di configurazione Xml (legacy) o Java Annotations (moderno). In entrambi i casi, la decisione su quale tipo di oggetto verrebbe creato verrebbe fatta durante il runtime. Un oggetto verrebbe iniettato da Xml nel nostro codice - Il nostro codice dipende da Xml per quel lavoro. Quindi, Dependency Injection (DI). DI non solo aiuta a rendere il nostro sistema liberamente accoppiato, ma semplifica la scrittura dei test unitari poiché consente di deridere le dipendenze. Ultimo ma non meno importante, DI semplifica la programmazione orientata agli aspetti (AOP) che porta a un ulteriore disaccoppiamento e aumento della modularità. Si noti inoltre che sopra DI è l'iniezione del costruttore.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
La primavera è una buona alternativa alla tecnologia Enterprise JavaBeans (EJB) . Dispone inoltre di framework web e componente framework di servizi web.
La primavera è iniziata come un sistema di iniezione di dipendenza abbastanza semplice. Ora è enorme e ha tutto (tranne per il proverbiale lavello della cucina).
Ma non temere, è abbastanza modulare, quindi puoi usare solo i pezzi che desideri.
Per vedere da dove è iniziato tutto, prova:
Potrebbe essere vecchio ma è un libro eccellente.
Per un altro buon libro questa volta dedicato esclusivamente alla primavera vedi:
Fa riferimento anche alle versioni precedenti di Spring, ma vale sicuramente la pena guardarle.
All'inizio la primavera era l'iniezione di dipendenza, quindi si aggiungeva re di wrapper per quasi tutto (wrapper su implementazioni JPA ecc.).
Lunga storia ... la maggior parte delle soluzioni XML preffer di Spring (motore di scripting XML ... brrrr), quindi per DI uso Guice
Buona libreria, ma con crescente depnedenciec, ad esempio Spring JDBC (forse una soluzione jdbc Java con parametri di nomi reali) prende dal prossimo 4-5.
Usando Spring MVC (parte di "big spring") per lo sviluppo web ... è un framework basato su "richieste", c'è una guerra santa "richiesta vs componente" ... fino a te
In passato ho pensato al framework Spring dal punto di vista puramente tecnico.
Data l'esperienza del lavoro di gruppo e dello sviluppo di Webapp aziendali, direi che Spring è uno sviluppo più rapido di applicazioni (applicazioni Web) disaccoppiando i suoi singoli elementi (bean). Lo sviluppo più rapido lo rende così popolare. Spring consente di spostare la responsabilità della costruzione (cablaggio) dell'applicazione sul framework Spring. L' iniezione di dipendenza del framework Spring è responsabile del collegamento / cablaggio dei singoli bean in un'applicazione funzionante.
In questo modo gli sviluppatori possono concentrarsi maggiormente sullo sviluppo di singoli componenti (bean) non appena vengono definite le interfacce tra i bean.
Il test di tale applicazione è semplice: l'attenzione principale è rivolta ai singoli bean. Possono essere facilmente disaccoppiati e derisi, quindi i test unitari sono rapidi ed efficienti.
Il framework Spring definisce più bean specializzati come @Controller ( @Restcontroller ), @Repository , @Component per scopi Web. Spring insieme a Maven forniscono una struttura intuitiva per gli sviluppatori. Il lavoro di squadra è facile e veloce in quanto vi sono singoli elementi separati e riutilizzabili.
Il framework Spring è sicuramente buono per lo sviluppo web e per essere più specifico per i servizi API riposanti.
È buono per quanto sopra a causa della sua iniezione di dipendenza e integrazione con altri moduli come sicurezza della molla , molla aop , framework mvc , microservizi
Con qualsiasi applicazione, la sicurezza è molto probabilmente un requisito.
Se miri a costruire un prodotto che richiede una lunga manutenzione, dovrai utilizzare il concetto Aop.
Se l'applicazione ha molto traffico, aumentando così il carico, è necessario utilizzare il concetto di microservizi.
Spring offre tutte queste funzionalità in un'unica piattaforma. Supporto con molti moduli .
Ancora più importante, la primavera è open source e un framework estensibile, ha un gancio ovunque per integrare il codice personalizzato nel ciclo di vita.
Spring Data è un progetto che fornisce l'integrazione con il tuo progetto.
Quindi la primavera può adattarsi a quasi ogni esigenza.