Ich höre viel über Spring , die Leute sagen überall im Web, dass Spring ein guter Rahmen für die Webentwicklung ist. Was genau ist Spring Framework?
Grundsätzlich ist Spring ein Framework für Dependency-Injection , ein Muster, mit dem sich sehr entkoppelte Systeme aufbauen lassen.
Angenommen, Sie müssen die Benutzer des Systems auflisten und so eine Schnittstelle mit dem Namen UserLister
deklarieren:
public interface UserLister {
List<User> getUsers();
}
Und vielleicht eine Implementierung, die auf eine Datenbank zugreift, um alle Benutzer zu erreichen:
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Aus Ihrer Sicht 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 userLister
nicht initialisiert hat. Was sollen wir machen? 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 ist, wenn ich von der DB-Implementierung zu einer anderen wechseln möchte, die die Benutzerliste aus einer durch Kommas getrennten Datei abruft (denken Sie daran, es ist ein Beispiel)? In diesem Fall würde ich meinen Code erneut aufrufen und die letzte Zeile folgendermaßen ändern:
UserLister userLister = new UserListerCommaSeparatedFile();
Mit einem kleinen Programm wie diesem ist das kein Problem, aber ... Was passiert in einem Programm mit Hunderten von Views und einer ähnlichen Anzahl von Business-Klassen? Die Wartung wird zum Albtraum!
Was Spring tut, ist wire die Klassen mithilfe einer XML-Datei oder Annotationen aufzurüsten. Auf diese Weise werden alle Objekte von Spring instanziiert und initialisiert und injected an den richtigen Stellen (Servlets) , Web Frameworks, Business Classes, DAOs usw. usw. usw.).
Zurück zum Beispiel im Frühjahr müssen wir nur einen Setter für das Feld userLister
haben und entweder eine XML-Datei wie diese haben:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
oder einfach die in unserer Ansichtsklasse abgelegten Anmerkungen mit @Inject
versehen:
@Inject
private UserLister userLister;
Wenn die Ansicht erstellt wird, ist auf diese Weise magisch ein UserLister
einsatzbereit.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
Es ist großartig! Ist es nicht
UserLister
Schnittstelle verwenden möchten? Ändern Sie einfach das XMLUserLister
-Implementierung bereitsteht? Programmieren Sie eine temporäre Scheinimplementierung von UserLister
und vereinfachen Sie die Entwicklung der AnsichtEs 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, dass die Jungs von SpringSource viele viele POJOs programmiert haben, die dazu beitragen, Spring mit vielen anderen gängigen Frameworks zu integrieren, ohne zu sein aufdringlich in Ihrer Anwendung. Spring hat auch einige gute Unterprojekte wie Spring MVC, Spring WebFlow, Spring Security und wieder eine lange Liste von etceteras.
Hoffe das hilft. Wie auch immer, ich ermutige Sie, Martin Fowlers Artikel über Abhängigkeitsinjektion und Inversion der Kontrolle zu lesen, weil er es besser macht als ich. Wenn Sie die Grundlagen verstanden haben, schauen Sie sich Spring Documentation anMeiner Meinung nach ist war das beste Frühlingsbuch aller Zeiten.
Spring enthält (wie Skaffman zu Recht darauf hingewiesen hat) ein MVC-Framework. Um es kurz zu erläutern, hier sind meine Eingaben. Spring unterstützt die Trennung von Service-Layer, Web-Layer und Business-Layer. Um dies mit einem Beispiel 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
}
}
Jetzt haben Sie in Ihrem Code eine Klasse namens RoadTrip wie folgt
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Nun, wann immer Sie eine Instanz von Trip wünschen; Manchmal möchten Sie, dass ein SUV das FourWheel initialisiert, oder Sie möchten manchmal eine Limousine. Es hängt wirklich davon ab, was Sie je nach Situation wünschen.
Um dieses Problem zu lösen, möchten Sie ein Fabrikmuster als Erzeugungsmuster haben. Wo eine Fabrik die richtige Instanz zurückgibt. Irgendwann werden Sie dann mit viel Klebe-Code enden, um Objekte richtig zu instanziieren. Der Frühling leistet den Klebercode am besten ohne diesen Klebercode. Sie deklarieren Zuordnungen in XML und initialisieren die Objekte automatisch. Es verwendet auch sehr viele Singleton-Architekturen für Instanzen, was zur Optimierung der Speichernutzung beiträgt.
Dies wird auch als Inversion der Kontrolle bezeichnet. Andere Rahmen hierfür sind Google guice, Pico-Container usw.
Darüber hinaus verfügt Spring über ein Validierungs-Framework, umfassende Unterstützung für DAO-Layer in Zusammenarbeit mit JDBC, iBatis und Hibernate (und vielen anderen). Bietet eine hervorragende Transaktionskontrolle für Datenbanktransaktionen.
Es gibt viel mehr zu Spring, das man in guten Büchern wie "Pro Spring" nachlesen kann.
Folgende 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
Alte Tage, Spring war nur ein Abhängigkeitsinjektionsrahmenwerk (Guice, PicoContainer, ...), aber jetzt ist es eine Gesamtlösung für die Erstellung von Enterprise Application.
Die Spritzenabhängigkeit der Frühlingsabhängigkeit, die natürlich das Herz des Frühlings ist, ist immer noch da (und Sie können hier andere gute Antworten lesen), aber es gibt noch mehr vom Frühling ....
Der Frühling hat jetzt viele Projekte mit jeweils einigen Unterprojekten ( http://spring.io/projects ). Wenn jemand über den Frühling spricht, müssen Sie herausfinden, über welches Federprojekt er spricht. Ist es nur ein Federkern, der als Federrahmen bezeichnet wird, oder ist es ein anderes Federprojekt?.
Einige Frühlingsprojekte, die zu erwähnen sind, sind:
Wenn Sie weitere spezifische Funktionen für Ihre Anwendung benötigen, finden Sie sie auch dort:
Es gibt auch einige kleine Projekte, zum Beispiel spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )
Sie können spring für die Webentwicklung verwenden, da es über das Spring MVC
-Modul verfügt, das Teil des Projekts Spring Framework ist. Oder Sie können spring mit einem anderen Webrahmenwerk wie struts2 verwenden.
Was ist Frühling? Ich werde diese Frage in Kürze beantworten, aber werfen wir zunächst einen Blick auf das Beispiel von Victor Hugo. Dies ist kein hervorragendes Beispiel, da es nicht die Notwendigkeit eines neuen Rahmens 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 Hunderte oder Tausende von Ansichten haben, müssen Sie also nur die eine Zeile Code ändern, wie in der Spring-XML-Methode ..__ Eine Änderung einer Codezeile erfordert jedoch immer noch eine Neukompilierung im Gegensatz zur Bearbeitung von XML ? Nun, mein flinker Freund, nutze Ant und das Skript weg!
Was ist der Frühling? Es ist für:
Weiterführende Literatur: http://discuss.joelonsoftware.com/?joel.3.219431.12
Sehr kurz zusammengefasst möchte ich sagen, dass Spring der "Kleber" in Ihrer Anwendung ist. Es wird verwendet, um verschiedene Frameworks und Ihren eigenen Code zu integrieren.
Frühling ist drei Dinge.
Das Problem ist, dass Spring DI wirklich gut durchdacht ist. Die Umhüllungen für andere Dinge sind wirklich gut durchdacht, da die anderen Dinge alles durchdacht haben und Spring es einfach schön umhüllt. Die Spring-Implementierungen von MVC und REST und all den anderen Sachen sind nicht so gut gemacht (YMMV, IMHO), aber es gibt Ausnahmen (Spring Security ist da bomb). Also ich neige dazu, Spring für DI und seine coolen Wrapper zu verwenden, bevorzuge aber anderes Material für Web (ich mag Tapestry sehr), REST (Jersey ist wirklich robust) usw.
Was möchten Sie wahrscheinlich in einer Webanwendung mit Spring -
Außerdem ist Spring riesig - es gibt also viele andere Dinge, die Sie in einer Web-App wie Spring AOP oder Spring Security interessieren könnten. Die vier oben aufgeführten Dinge beschreiben jedoch die allgemeinen Komponenten von Spring, die in einer Web-App verwendet werden.
Ich sehe zwei Teile dazu:
Beachten Sie, dass Sie Spring in einer Webanwendung ohne Spring MVC verwenden können. Ich würde sagen, dass die meisten Java-Webanwendungen dies tun, während sie andere Web-Frameworks wie Wicket, Struts, Seam usw. verwenden.
Der Frühling eignet sich hervorragend zum Zusammenkleben von Klasseninstanzen. Sie wissen, dass Ihre Hibernate-Klassen immer eine Datenquelle benötigen. Spring verbindet sie miteinander (und hat auch eine Implementierung der Datenquelle).
Ihre Datenzugriffsobjekte benötigen immer Hibernate-Zugriff. Dringend werden die Hibernate-Klassen für Sie in Ihre DAOs eingefügt.
Darüber hinaus bietet Spring Ihnen im Wesentlichen solide Konfigurationen einer Reihe von Bibliotheken, und Sie erhalten dadurch Anleitung, welche Bibliotheken Sie verwenden sollten.
Der Frühling ist wirklich ein großartiges Werkzeug. (Ich habe nicht über Spring MVC gesprochen, nur das Basisgerüst).
Die akzeptierte Antwort umfasst nicht die Verwendung von Anmerkungen, seit Spring die Unterstützung verschiedener Anmerkungen zur Konfiguration eingeführt hat.
Es gibt die andere Möglichkeit, die Klassen zusammen mit einer XML-Datei zu verbinden: die Anmerkungen. Verwenden wir das Beispiel aus der akzeptierten Antwort und registrieren Sie die Bean direkt in der Klasse mit einer der Anmerkungen @Component
, @Service
, @Repository
oder @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Auf diese Weise wird beim Erstellen der Ansicht auf magische Weise ein UserLister für die Arbeit bereit sein.
Die obige Anweisung ist mit einem kleinen Bonus gültig, da keine Verwendung von XML-Dateien und die Verdrahtung mit einer anderen Anmerkung @Autowired
erforderlich ist, die eine relevante Implementierung findet und diese einfügt.
@Autowired
private UserLister userLister;
Verwenden Sie die Annotation @Bean
für eine Methode, mit der die Bean-Implementierung injiziert wird.
Der Vorteil ist Dependency Injection (DI) . Es bedeutet das Outsourcing der Aufgabe der Objekterstellung. Lassen Sie mich mit einem Beispiel erklären.
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
}
}
Jetzt habe ich in meinem Code 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 Stimmung Buffet () oder Plated (). Dieses System ist jedoch eng miteinander gekoppelt. Jedes Mal, wenn wir einen anderen Objekttyp benötigen, müssen wir den Code ändern. In diesem Fall eine Zeile auskommentieren! Stellen Sie sich vor, es gibt 50 verschiedene Klassen, die von 50 verschiedenen Personen genutzt werden. Es wäre ein verdammtes Durcheinander. In diesem Fall müssen wir das System entkoppeln. Lassen Sie uns die LunchDecide-Klasse neu schreiben.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Beachten Sie, dass, anstatt ein Objekt mit einem neuen Schlüsselwort zu erstellen, wir die Referenz an ein Objekt des Lunch-Typs als Parameter an unseren Konstruktor übergeben haben. Hier wird die Objekterstellung ausgelagert. Dieser Code kann entweder mit der XML-Konfigurationsdatei (Legacy) oder mit Java Annotations (modern) verbunden werden. In beiden Fällen würde die Entscheidung, welcher Objekttyp erstellt werden würde, zur Laufzeit dort erfolgen. Ein Objekt würde von XML in unseren Code eingefügt. Unser Code ist für diesen Job von XML abhängig. Daher Abhängigkeitsinjektion (DI). DI hilft nicht nur dabei, unser System locker gekoppelt zu machen, sondern vereinfacht auch das Schreiben von Komponententests, da Abhängigkeiten simuliert werden können. Nicht zuletzt optimiert DI die Aspect Oriented Programming (AOP), was zu einer weiteren Entkopplung und Erhöhung der Modularität führt. Beachten Sie auch, dass oberhalb von DI Constructor Injection steht. DI kann auch durch Setter Injection erfolgen - dieselbe einfache Setzmethode aus der Kapselung.
Spring ist eine gute Alternative zu Enterprise JavaBeans (EJB) Technologie. Es verfügt auch über ein Web-Framework und eine Web-Services-Framework-Komponente.
Frühling war Abhängigkeitsinjektion am Anfang, dann fügen Sie für fast alles King of Wrapper hinzu (Wrapper über JPA-Implementierungen usw.).
Lange Geschichte ... die meisten Teile von Spring bevorzugen XML-Lösungen (XML-Scripting-Engine ... brrrr), daher verwende ich für DI Guice
Gute Bibliothek, aber mit wachsender depnedenciec, zum Beispiel Spring JDBC (vielleicht eine Java-Jdbc-Lösung mit echten Namensparametern), aus Maven 4-5 weiter.
Spring MVC (Teil von "big spring") für die Webentwicklung verwenden ... es ist ein "request-based" Framework, es gibt "holy war" "Request vs Component" ... bis zu Ihnen
Der Frühling begann als recht einfaches Abhängigkeitseinspritzsystem. Jetzt ist es riesig und hat alles drin (bis auf die sprichwörtliche Küchenspüle).
Aber keine Angst, es ist ziemlich modular, so dass Sie nur die Stücke verwenden können, die Sie wollen.
Um zu sehen, wo alles begann, versuche es:
Es ist vielleicht alt, aber es ist ein ausgezeichnetes Buch.
Für ein weiteres gutes Buch, das dieses Mal ausschließlich dem Frühling gewidmet ist, siehe:
Es bezieht sich auch auf ältere Versionen von Spring, ist aber definitiv einen Blick wert.
In der Vergangenheit habe ich aus rein technischer Sicht über Spring Framework nachgedacht.
Mit etwas Erfahrung in der Teamarbeit und der Entwicklung von Enterprise-Webapps - ich würde sagen, Spring ist für schnellere Entwicklung von Anwendungen (Webanwendungen) durch Entkopplung seiner einzelnen Elemente (Beans). Schnellere Entwicklung macht es so beliebt. Spring ermöglicht die Verlagerung der Verantwortung für den Aufbau (Verdrahtung) der Anwendung auf das Spring-Framework. Das Abhängigkeitsinjektion des Spring-Frameworks ist für die Verbindung/Verdrahtung einzelner Beans zu einer funktionierenden Anwendung verantwortlich.
Auf diese Weise können Entwickler sich mehr auf die Entwicklung einzelner Komponenten (Beans) konzentrieren, sobald Schnittstellen zwischen Beans definiert sind.
Das Testen dieser Anwendung ist einfach - der Hauptfokus liegt auf einzelnen Beans. Sie können leicht entkoppelt und verspottet werden, so dass das Testen von Einheiten schnell und effizient ist.
Das Spring-Framework definiert mehrere spezialisierte Beans wie @Controller (@Restcontroller), @Repository, @Component für Webzwecke. Spring zusammen mit Maven bieten eine für Entwickler intuitive Struktur. Die Teamarbeit ist einfach und schnell, da einzelne Elemente voneinander getrennt sind und wiederverwendet werden können.
Spring Framework ist auf jeden Fall gut für die Web-Entwicklung, die spezifischer für Rest api ist .. _ aufgrund der Abhängigkeit von Abhängigkeit und Integration mit anderen Modulen wie spring security , spring aop , mvc Framework , microservices
Für jede Anwendung, die Sie auf jeden Fall erstellen, benötigen Sie Sicherheit .
Wenn Sie ein Produkt mit langem Wartungsaufwand bauen, benötigen Sie trotzdem ein Aop-Konzept.
Wenn Ihre Anwendung viel mehr Last hat, müssen Sie Microservices ..__ implementieren.
Der Frühling bietet all das auf einer Plattform. Unterstützung mit vielen Modulen
Die Hauptsache ist, dass der Frühling Open Source und ein erweiterbares Framework ist, das überall einen Haken hat, um benutzerdefinierten Code in den Lebenszyklus zu integrieren.
Spring Data ist ein Projekt, das die Integration in Ihr Projekt ermöglicht.
Alles, was Sie zum Erstellen der Anwendung benötigen, hat Spring.