it-swarm.com.de

Was genau ist Spring Framework?

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?

566
Maksim

Grundsätzlich ist Spring ein Framework für Dependency-Injection , ein Muster, mit dem sich sehr entkoppelte Systeme aufbauen lassen.

Das Problem

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!

Spring (Dependency Injection) Ansatz

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

  • Was ist, wenn Sie eine andere Implementierung Ihrer UserLister Schnittstelle verwenden möchten? Ändern Sie einfach das XML
  • Was ist, wenn keine UserLister -Implementierung bereitsteht? Programmieren Sie eine temporäre Scheinimplementierung von UserLister und vereinfachen Sie die Entwicklung der Ansicht
  • Was ist, wenn ich Spring nicht mehr verwenden möchte? Verwenden Sie es einfach nicht! Ihre Anwendung ist nicht damit verbunden. Inversion of Control heißt es: "Die Anwendung steuert das Framework, nicht das Framework steuert 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, 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.

693
victor hugo

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

57
Priyank

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:

  • Spring Batch Batch Framework für die Entwicklung von
    Batch-Anwendung
  • Spring HATEOAS einfache Erstellung von REST API-Basis auf HATEOAS-Prinzip
  • Spring Mobile und Spring Andriod für die Entwicklung mobiler Anwendungen
  • Spring Shell erstellt eine voll funktionsfähige Shell-Anwendung (auch als Befehlszeile bezeichnet) 
  • Spring Cloud und Spring Cloud-Datenfluss für Cloud-Anwendungen

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.

35
Alireza Fattahi

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:

  1. Blinde Entwickler, die der Herde folgen
  2. Arbeitgeber, die nie einen Programmierer für Hochschulabsolventen einstellen wollen, weil sie an der Uni keine derartigen Rahmenbedingungen unterrichten
  3. Projekte, die mit einem schlechten Design begonnen haben und Patchwork erfordern (wie das Beispiel von Victor Hugo zeigt)

Weiterführende Literatur: http://discuss.joelonsoftware.com/?joel.3.219431.12

25
Ash

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.

18
Johan

Frühling ist drei Dinge.

  1. Spring Griffe Dependency Injection und ich empfehle Ihnen, Martin Fowlers hervorragende Einführung in Abhängigkeitsinjektion zu lesen.
  2. Die zweite Sache, die Spring tut, ist, exzellente Java-Bibliotheken auf sehr elegante Weise zu verpacken, um sie in Ihren Anwendungen zu verwenden. Ein gutes Beispiel zeigt, wie Spring Task Executors und Quartz Scheduler umschließt. 
  3. Drittens bietet Spring eine Reihe von Implementierungen von Webmaterial wie REST, ein MVC-Webframework und vieles mehr. Sie stellen fest, dass Sie Spring für die ersten beiden verwenden. Vielleicht können Sie es einfach für alles verwenden, was Ihre Web-App benötigt. 

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.

13
karstensrage

Was möchten Sie wahrscheinlich in einer Webanwendung mit Spring - 

  • Spring MVC, das mit 2.5+ die Verwendung von POJOs als Controller-Klassen ermöglicht, was bedeutet, dass Sie nicht von einem bestimmten Framework (wie in Struts oder Spring pre-2.5) ausgehen müssen. Controller-Klassen lassen sich dank der Abhängigkeitseinspritzung auch ganz einfach testen
  • Spring Integration mit Hibernate, die die Arbeit mit dieser ORM-Lösung (in den meisten Fällen) vereinfacht.
  • Wenn Sie Spring für eine Webanwendung verwenden, können Sie Ihre Domänenobjekte auf allen Ebenen der Anwendung verwenden. Dieselben Klassen, die mit Hibernate zugeordnet werden, sind die Klassen, die Sie als "Form-Beans" verwenden. Dies führt naturgemäß zu einem robusteren Domänenmodell, zum Teil, weil dadurch die Anzahl der Klassen reduziert wird.
  • Spring-Formular-Tags erleichtern das Erstellen von Formularen ohne viel Aufwand. 

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. 

11
bpapa

Ich sehe zwei Teile dazu:

  1. "Was genau ist Frühling" -> sehen Sie die akzeptierte Antwort von Victor Hugo.
  2. "[...] Frühling ist [ein] guter Rahmen für die Webentwicklung" -> Leute, die dies sagen, sprechen von Spring MVC. Spring MVC ist einer der vielen Teile von Spring und ist ein Web-Framework, das die allgemeinen Funktionen von Spring wie die Abhängigkeitseinspritzung nutzt. Es ist ein ziemlich generisches Framework, da es sehr konfigurierbar ist: Sie können verschiedene Datenbankebenen (Hibernate, iBatis, JDBC) und verschiedene Ansichtsebenen (JSP, Velocity, Freemarker ...) verwenden

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.

8
Tom De Leu

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).

7
stevedbrown

Die akzeptierte Antwort umfasst nicht die Verwendung von Anmerkungen, seit Spring die Unterstützung verschiedener Anmerkungen zur Konfiguration eingeführt hat.

Spring-Ansatz (Abhängigkeitsinjektion)

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.

5
Nikolas

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. 

4
Sumit Pokhrel

Spring ist eine gute Alternative zu Enterprise JavaBeans (EJB) Technologie. Es verfügt auch über ein Web-Framework und eine Web-Services-Framework-Komponente.

3
fastcodejava
  • Spring ist ein leichtes und flexibles Framework im Vergleich zu J2EE.
  • Federbehälter wirken als Umkehrung der Kontrolle. 
  • Spring verwendet AOP, d. H. Proxys und Muster für Singleton, Factory und Template Method Design.
  • Tiered-Architekturen: Trennung von Anliegen und wiederverwendbaren Schichten und einfache Wartung.

 enter image description here

2
Premraj

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

1
Jacek Cz

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:

http://www.Amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

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:

http://www.Amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

Es bezieht sich auch auf ältere Versionen von Spring, ist aber definitiv einen Blick wert.

1
Pablojim

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.

0
Witold Kaczurba

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. 

0
pratik deshai