Ich höre viel über Frühling Überall im Web wird gesagt, dass Spring ein gutes Framework für die Webentwicklung ist. Wofür genau ist Spring Framework in einer Nussschale? Warum sollte ich es statt einfachem Java verwenden?
Antworten
Zu viele Anzeigen?Der Frühling besteht aus drei Dingen.
- Spring beherrscht Dependency Injection, und ich empfehle Ihnen, Martin Fowlers ausgezeichnete Einführung in die Dependency Injection zu lesen.
- Die zweite Sache, die Spring macht, ist, exzellente Java-Bibliotheken auf eine sehr elegante Art und Weise zu verpacken, um sie in Ihren Anwendungen zu verwenden. Ein gutes Beispiel dafür ist, wie Spring Task Executors und Quartz Scheduler umhüllt.
- Drittens bietet Spring eine Reihe von Web-Implementierungen wie REST, ein MVC-Web-Framework und mehr. Sie denken, da Sie Spring für die ersten beiden verwenden, können Sie es vielleicht einfach für alles verwenden, was Ihre Webanwendung braucht.
Das Problem ist, dass Spring DI wirklich gut durchdacht ist, die Wrapper um andere Dinge sind wirklich gut durchdacht, dass die anderen Dinge alles durchdacht haben und Spring es einfach schön verpackt. Die Spring-Implementierungen von MVC und REST und all die anderen Dinge sind nicht so gut gemacht (YMMV, IMHO), aber es gibt Ausnahmen (Spring Security ist da bomb). Ich neige also dazu, Spring für DI und seine coolen Wrapper zu verwenden, bevorzuge aber andere Dinge für Web (ich mag Tapestry sehr), REST (Jersey ist wirklich robust), usw.
Was Sie wahrscheinlich in einer Webanwendung mit Spring - wünschen würden
- Spring MVC, das ab Version 2.5 die Verwendung von POJOs als Controller-Klassen ermöglicht, was bedeutet, dass Sie nicht von einem bestimmten Framework erweitern müssen (wie in Struts oder Spring vor Version 2.5). Controller-Klassen sind auch dank der Dependency Injection sehr einfach zu testen
- Spring-Integration mit Hibernate, die die Arbeit mit dieser ORM-Lösung (in den meisten Fällen) sehr vereinfacht
- Die Verwendung von Spring für eine Webanwendung ermöglicht es Ihnen, Ihre Domänenobjekte auf allen Ebenen der Anwendung zu verwenden - dieselben Klassen, die mit Hibernate abgebildet werden, sind die Klassen, die Sie als "Form Beans" verwenden. Dies führt naturgemäß zu einem robusteren Domänenmodell, unter anderem weil die Anzahl der Klassen reduziert wird.
- Spring-Formular-Tags erleichtern die Erstellung von Formularen ohne großen Aufwand.
Außerdem ist Spring sehr umfangreich - es gibt also noch eine Menge anderer Dinge, die Sie in einer Webanwendung verwenden möchten, wie Spring AOP oder Spring Security. Aber die vier oben aufgeführten Dinge beschreiben die üblichen Komponenten von Spring, die in einer Webanwendung verwendet werden.
Ich sehe hier zwei Aspekte:
- "Wofür genau ist Spring da?" -> siehe die akzeptierte Antwort von victor hugo.
- "[...] Spring ist [ein] gutes Framework für die Webentwicklung" -> Leute, die dies sagen, sprechen über Spring MVC. Spring MVC ist einer der vielen Teile von Spring und ist ein Web-Framework, das die allgemeinen Funktionen von Spring nutzt, wie z.B. Dependency Injection. Es ist ein ziemlich generisches Framework, da es sehr konfigurierbar ist: Sie können verschiedene Datenbankschichten (Hibernate, iBatis, einfaches JDBC), verschiedene Ansichtsschichten (JSP, Velocity, Freemarker...) verwenden.
Beachten Sie, dass Sie Spring sehr wohl in einer Webanwendung verwenden können, ohne Spring MVC zu benutzen. Ich würde sagen, die meisten Java-Webanwendungen tun dies, während andere Web-Frameworks wie Wicket, Struts, Seam, ... verwendet werden.
Spring eignet sich hervorragend, um Instanzen von Klassen zusammenzukleben. Sie wissen, dass Ihre Hibernate-Klassen immer eine Datenquelle benötigen werden. Spring verbindet sie miteinander (und hat auch eine Implementierung der Datenquelle).
Ihre Datenzugriffsobjekte werden immer Hibernate-Zugriff benötigen, Spring verdrahtet die Hibernate-Klassen für Sie in Ihre DAOs.
Darüber hinaus bietet Spring im Grunde genommen solide Konfigurationen für eine Reihe von Bibliotheken und gibt Ihnen damit eine Anleitung, welche Bibliotheken Sie verwenden sollten.
Der Frühling ist wirklich ein großartiges Werkzeug. (Ich habe nicht über Spring MVC gesprochen, nur über das Basis-Framework).
Der Vorteil ist Dependency Injection (DI) . Das bedeutet, dass die Aufgabe der Objekterstellung ausgelagert wird, was ich anhand eines Beispiels erläutern möchte.
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
}
}
In meinem Code habe ich nun eine Klasse LunchDecide wie folgt:
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
}
}
In der obigen Klasse wählen wir je nach Lust und Laune Buffet() oder Plated(). Dieses System ist jedoch eng gekoppelt. Jedes Mal, wenn wir eine andere Art von Objekt benötigen, müssen wir den Code ändern. In diesem Fall, indem wir eine Zeile auskommentieren! Stellen Sie sich vor, es gibt 50 verschiedene Klassen, die von 50 verschiedenen Personen verwendet werden. Das wäre ein riesiges Durcheinander. In diesem Fall müssen wir das System entkoppeln. Lassen Sie uns die Klasse LunchDecide neu schreiben.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Beachten Sie, dass wir anstelle der Erstellung eines Objekts mit dem Schlüsselwort new den Verweis auf ein Objekt vom Typ Lunch als Parameter an unseren Konstruktor übergeben haben. Hier wird die Objekterstellung ausgelagert. Dieser Code kann entweder mit einer Xml-Konfigurationsdatei (Legacy) oder mit Java-Annotationen (Modern) verdrahtet werden. In beiden Fällen würde die Entscheidung, welcher Objekttyp erstellt werden soll, zur Laufzeit getroffen. Ein Objekt würde von Xml in unseren Code injiziert werden - unser Code ist für diese Aufgabe von Xml abhängig. Daher Dependency Injection (DI). DI hilft nicht nur dabei, unser System lose zu koppeln, sondern vereinfacht auch das Schreiben von Unit-Tests, da Abhängigkeiten gespottet werden können. Nicht zuletzt vereinfacht DI die aspektorientierte Programmierung (AOP), was zu einer weiteren Entkopplung und Erhöhung der Modularität führt. Beachten Sie auch, dass über DI die Constructor Injection steht. DI kann auch durch Setter Injection durchgeführt werden - dieselbe einfache alte Setter-Methode wie bei der Kapselung.
15 Stimmen
Ich verstehe, dass die Frage sehr weit gefasst ist, aber ich denke, dass die Frage in diesem speziellen Fall sehr wichtig für Junion-Entwickler ist, die oft von Leuten über Spring gesprochen werden, die davon ausgehen, dass es so populär ist, dass man nicht einmal sagen muss, was es tut. Heben Sie doch mal die Hand, wenn Sie noch nie von Instagram gehört haben und was dessen Zweck ist.... (Geständnis: Ich habe Insta nie benutzt)
2 Stimmen
Die Frage wurde vor 10 Jahren gestellt, und damals war Spring noch etwas kleiner als heute mit all seinen Unterprojekten wie Spring Boot, Spring Data, Spring Rest usw. Und eigentlich ist das der Grund, warum es vor einem Jahr näher war, wegen der Breite dieser Frage. Zu der Zeit, als ich diese Frage stellte, wollte ich einfach nur DI verstehen und warum es benötigt wird.