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?Im Grunde ist Spring ein Rahmenwerk für dependency-injection ein Muster, das den Aufbau stark entkoppelter Systeme ermöglicht.
Das Problem
Angenommen, Sie müssen die Benutzer des Systems auflisten und deklarieren daher eine Schnittstelle namens UserLister
:
public interface UserLister {
List<User> getUsers();
}
Und vielleicht eine Implementierung, die auf eine Datenbank zugreift, um alle Benutzer zu erhalten:
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
In Ihrer Ansicht müssen Sie auf eine Instanz zugreifen (nur ein Beispiel, denken Sie daran):
public class SomeView {
private UserLister userLister;
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Beachten Sie, dass der obige Code die Variable nicht initialisiert hat userLister
. Was sollten wir tun? Wenn ich das Objekt explizit wie folgt instanziiere:
UserLister userLister = new UserListerDB();
...Ich würde die Ansicht mit meiner Implementierung der Klasse koppeln, die auf die DB zugreift. Was, wenn ich von der DB-Implementierung zu einer anderen wechseln möchte, die die Benutzerliste aus einer kommagetrennten Datei abruft (denken Sie daran, es ist ein Beispiel)? In diesem Fall würde ich wieder zu meinem Code gehen und die obige Zeile ändern in:
UserLister userLister = new UserListerCommaSeparatedFile();
Bei einem kleinen Programm wie diesem ist das kein Problem, aber... Was passiert in einem Programm, das Hunderte von Ansichten und eine ähnliche Anzahl von Geschäftsklassen hat? Die Wartung wird zu einem Alptraum!
Spring (Dependency Injection) Ansatz
Was der Frühling bewirkt, ist Draht die Klassen mit Hilfe einer XML-Datei oder von Annotationen zu erstellen. Auf diese Weise werden alle Objekte von Spring instanziiert und initialisiert und eingespritzt an den richtigen Stellen (Servlets, Web-Frameworks, Business-Klassen, DAOs, usw., usw...).
Um auf das Beispiel in Spring zurückzukommen, brauchen wir nur einen Setter für die userLister
Feld und haben entweder eine XML-Datei wie diese:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
oder ganz einfach das Feld in unserer View-Klasse annotieren mit @Inject
:
@Inject
private UserLister userLister;
Auf diese Weise wird bei der Erstellung der Ansicht magisch haben eine UserLister
bereit zur Arbeit.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
Es ist großartig! Ja, nicht wahr?
- Was ist, wenn Sie eine andere Implementierung Ihrer
UserLister
Schnittstelle? Ändern Sie einfach das XML. - Was ist, wenn Sie keine
UserLister
Umsetzung bereit? Programmieren Sie eine zeitlich begrenzte Scheinimplementierung vonUserLister
und die Entwicklung des Blicks zu erleichtern. - Was ist, wenn ich Spring nicht mehr verwenden möchte? Benutzen Sie es einfach nicht! Ihre Anwendung ist nicht an sie gekoppelt. Umkehrung der Kontrolle heißt es: "Die Anwendung kontrolliert den Rahmen, nicht der Rahmen die Anwendung".
Es gibt noch einige andere Optionen für Dependency Injection. Was Spring meiner Meinung nach neben seiner Einfachheit, Eleganz und Stabilität so berühmt gemacht hat, ist die Tatsache, dass die Jungs von SpringSource viele POJOs programmiert haben, die dabei helfen, Spring in viele andere gängige Frameworks zu integrieren, ohne dabei in die Anwendung einzugreifen. Außerdem hat Spring mehrere gute Unterprojekte wie Spring MVC, Spring WebFlow, Spring Security und noch eine laaaange Liste von anderen Dingen.
Ich hoffe, das hilft. Wie auch immer, ich empfehle Ihnen zu lesen Der Artikel von Martin Fowler über Dependency Injection und Inversion of Control, weil er es besser kann als ich. Nachdem Sie die Grundlagen verstanden haben, werfen Sie einen Blick auf Frühling Dokumentation Meiner Meinung nach ist es es war früher das beste Frühlingsbuch aller Zeiten.
Frühling enthält ( wie Skaffman zu Recht feststellte ) ein MVC-Framework. Um es kurz zu erklären, hier sind meine Inputs. Spring unterstützt die Trennung von Service-Schicht, Web-Schicht und Business-Schicht, aber was es wirklich gut kann, ist die "Injektion" von Objekten. Um dies anhand eines Beispiels zu erklären, betrachten Sie das folgende Beispiel:
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
}
}
In Ihrem Code haben Sie nun eine Klasse namens RoadTrip wie folgt
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Nun, wenn Sie eine Instanz von Trip wollen; manchmal möchten Sie vielleicht einen SUV zu initialisieren FourWheel oder manchmal können Sie Sedan wollen. Es hängt wirklich davon ab, was Sie wollen, basierend auf der spezifischen Situation.
Um dieses Problem zu lösen, sollten Sie ein Factory Pattern als Erstellungsmuster verwenden. Wobei eine Fabrik die richtige Instanz zurückgibt. Das führt dazu, dass man am Ende viel Glue-Code hat, nur um Objekte korrekt zu instanzieren. Spring erledigt die Aufgabe des Glue Code am besten ohne diesen Glue Code. Man deklariert Mappings in XML und die Objekte werden automatisch initialisiert. Es verwendet außerdem eine Singleton-Architektur für Instanzen, was zu einer optimierten Speichernutzung beiträgt.
Dies wird auch als Umkehrung der Kontrolle bezeichnet. Andere Frameworks, die dies tun, sind Google Guice, Pico Container usw.
Darüber hinaus verfügt Spring über ein Validierungs-Framework, umfangreiche Unterstützung für DAO-Schichten in Zusammenarbeit mit JDBC, iBatis und Hibernate (und viele mehr). Bietet eine hervorragende Transaktionskontrolle über Datenbanktransaktionen.
Es gibt noch viel mehr zum Thema Frühling, das in guten Büchern wie "Pro Frühling" nachgelesen werden kann.
Die folgenden URLs können ebenfalls hilfreich sein.
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=SpringFramework
Die alten Zeiten, Frühling war nur ein Abhängigkeitsinjektionsrahmenwerk wie ( Guice , PicoContainer ,...), aber heutzutage ist es eine Komplettlösung für den Aufbau Ihrer Unternehmensanwendung .
Die Spring Dependency Injection, die natürlich das Herzstück von Spring ist, ist immer noch da (und Sie können andere gute Antworten hier nachlesen), aber es gibt noch mehr von Spring...
Spring hat jetzt viele Projekte, jedes mit einigen Unterprojekten ( http://spring.io/projects ). Wenn jemand vom Frühling spricht, müssen Sie herausfinden, was Frühjahrsprojekt von dem er spricht, ist es nur der Federkern, der bekannt ist als Federrahmen oder es handelt sich um ein anderes Frühjahrsprojekt.
Einige Frühjahrsprojekte, die es wert sind, erwähnt zu werden, sind:
- Frühlingssicherheit - http://projects.spring.io/spring-security/
- Spring Webservices - http://projects.spring.io/spring-ws/
- Frühjahrs-Integration - http://projects.spring.io/spring-integration/
Wenn Sie eine spezifischere Funktion für Ihre Anwendung benötigen, können Sie diese auch dort finden:
- Frühlingschargen Batch Framework, das die Entwicklung von
Batch-Anwendung - Frühling HATEOAS einfache Erstellung einer REST-API auf der Grundlage des HATEOAS-Prinzips
- Frühling Mobil et Frühling Andriod für die Entwicklung mobiler Anwendungen
- Federschale erstellt eine voll funktionsfähige Shell-Anwendung (auch Befehlszeile genannt)
- Frühlingswolke et Spring Cloud Datenfluss für Cloud-Anwendungen
Dort gibt es auch einige kleine Projekte, zum Beispiel frühling-sozial-facebook ( http://projects.spring.io/spring-social-facebook/ )
Sie können Spring für die Webentwicklung verwenden, da es die Spring MVC
Modul, das Teil von Spring Framework Projekt. Oder Sie können Spring mit einem anderen Web-Framework verwenden, wie Streben2 .
Wozu ist der Frühling da? Ich werde diese Frage in Kürze beantworten, aber zuerst wollen wir uns noch einmal das Beispiel von Victor Hugo ansehen. Es ist kein gutes Beispiel, weil es die Notwendigkeit eines neuen Frameworks nicht rechtfertigt.
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);
}
}
Erledigt! Selbst wenn Sie nun Hunderte oder Tausende von Ansichten haben, müssen Sie immer noch nur eine einzige Codezeile ändern, wie beim Spring-XML-Ansatz. Aber die Änderung einer Codezeile erfordert immer noch eine Neukompilierung im Gegensatz zur Bearbeitung von XML, sagen Sie? Nun, mein pingeliger Freund, verwenden Sie Ant und skripten Sie los!
Wozu also der Frühling? Er ist für:
- Blinde Entwickler, die der Herde folgen
- Arbeitgeber, die keine Programmierer mit Hochschulabschluss einstellen wollen, weil sie solche Frameworks nicht an der Universität unterrichten
- Projekte, die mit einem schlechten Entwurf begonnen haben und nachgebessert werden müssen (wie das Beispiel von Victor Hugo zeigt)
Lesen Sie weiter: http://discuss.joelonsoftware.com/?joel.3.219431.12
- See previous answers
- Weitere Antworten anzeigen
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.