java - Was genau ist das Spring Framework?


Ich höre viel über den Frühling , die Leute sagen überall im Web, dass Spring ein guter Rahmen für die Webentwicklung ist. Was genau ist das Spring Framework? Wie kann ich es für meine Web-Java-Anwendungsentwicklung verwenden? irgendwelche Beispiele?



Answers



Grundsätzlich ist Spring ein Framework für Dependency-Injection , ein Muster, das es erlaubt, sehr entkoppelte Systeme aufzubauen.

Das Problem

Angenommen, Sie müssen die Benutzer des Systems UserLister und so eine Schnittstelle namens UserLister :

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
    }
}

In Ihrer Ansicht müssen Sie auf eine Instanz zugreifen (nur ein Beispiel, erinnern Sie sich):

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 userLister . 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 kommagetrennten Datei erhält (erinnern Sie sich, es ist ein Beispiel)? In diesem Fall würde ich wieder zu meinem Code gehen und die letzte Zeile ändern durch:

UserLister userLister = new UserListerCommaSeparatedFile();

Dies hat kein Problem mit einem kleinen Programm wie diesem, aber ... Was passiert in einem Programm, das Hunderte von Views und eine ähnliche Anzahl von Business-Klassen hat. Die Wartung wird zum Albtraum!

Frühlingsansatz (Dependency Injection)

Was Spring tut, besteht darin , die Klassen mit einer XML-Datei zu verbinden. Auf diese Weise werden alle Objekte von Spring instanziiert und initialisiert und an die richtigen Stellen eingefügt (Servlets, Web-Frameworks, Business-Klassen, DAOs usw. usw ..). .).

userLister wir zum Beispiel im Frühjahr zurück, brauchen wir nur einen Setter für das userLister Feld und haben ein XML wie dieses:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

Auf diese Weise wird auf magische Weise ein UserLister zur Verfügung stehen, wenn die Ansicht erstellt wird.

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 UserLister ? Ändere einfach die XML
  • Was ist, wenn keine UserLister Implementierung bereit ist? Programmieren Sie eine temporäre UserLister von UserLister und erleichtern Sie die Entwicklung der Ansicht
  • Was ist, wenn ich Spring nicht mehr verwenden möchte? Benutze es einfach nicht! Ihre Anwendung ist nicht damit gekoppelt. Inversion of Control- Status: "Die Anwendung steuert das Framework, nicht das Framework steuert die Anwendung".

Es gibt einige andere Möglichkeiten für Dependency Injection, was meiner Meinung nach Spring so berühmt gemacht hat, dass SpringSource viele POJOs programmiert hat, die helfen, Spring mit vielen anderen gängigen Frameworks zu integrieren, ohne aufdringlich in Ihrer Anwendung. Auch Spring hat mehrere gute Teilprojekte 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 Dependency Injection und Inversion of Control zu lesen, weil er es besser macht als ich. Nachdem Sie die Grundlagen verstanden haben, werfen Sie einen Blick auf Spring Documentation , meiner Meinung nach ist es das beste Frühlingsbuch aller Zeiten.




Spring enthält ( wie Skaffman zu Recht herausgestellt hat ) ein MVC-Framework. Um es kurz zu erklären, hier sind meine Eingaben. Spring unterstützt die Trennung von Service-Schicht, Web-Schicht und Business-Schicht, aber was es am besten kann, ist die "Injektion" von Objekten. Um das 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;
}

Jetzt wann immer Sie eine Instanz von Trip wollen; Manchmal möchten Sie vielleicht ein SUV, um FourWheel zu initialisieren, oder manchmal möchten Sie vielleicht Sedan. Es hängt wirklich davon ab, was Sie basierend auf bestimmten Situationen wünschen.

Um dieses Problem zu lösen, solltest du ein Factory Pattern als kreatives Muster haben. Wo eine Fabrik die richtige Instanz zurückgibt. So werden Sie schließlich mit viel Glue-Code enden, nur um Objekte korrekt zu instanziieren. Spring erledigt die Arbeit des Klebecodes am besten ohne diesen Klebecode. Sie deklarieren Mappings in XML und initialisieren die Objekte automatisch. Es macht auch viel mit Singleton-Architektur für Instanzen und das hilft bei der optimierten Speichernutzung.

Dies wird auch als Inversion of Control bezeichnet. Andere Frameworks dafür sind Google guice, Pico Container usw.

Darüber hinaus verfügt Spring über ein Validierungs-Framework und umfangreiche Unterstützung für DAO-Layer in Zusammenarbeit mit JDBC, iBatis und Hibernate (und vielen anderen). Bietet eine hervorragende Transaktionssteuerung für Datenbanktransaktionen.

Es gibt viel mehr zu Spring, das in guten Büchern wie "Pro Spring" 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




Wofür ist der Frühling? Ich werde diese Frage kurz beantworten, aber zunächst wollen wir uns das Beispiel von Victor Hugo noch einmal ansehen. Es ist kein gutes Beispiel, weil 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 jetzt nur noch die eine Codezeile ändern, wie im Spring-XML-Ansatz. Aber das Ändern einer Codezeile erfordert immer noch das Neukompilieren im Gegensatz zur Bearbeitung von XML, wie Sie sagen? Na mein wählerischer Freund, benutzt Ant und Script weg!

Wofür ist der Frühling? Es ist für:

  1. Blinde Entwickler, die der Herde folgen
  2. Arbeitgeber, die keine Diplom-Programmierer einstellen wollen, weil sie solche Frameworks nicht an der Uni 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




Früher war der Frühling nur ein Abhängigkeits-Injektionsrahmen ( Guice , PicoContainer , ...), aber heute ist es eine totale Lösung für den Aufbau einer Enterprise-Anwendung .

Die Frühlingsabhängigkeitseinspritzung, die natürlich das Herz des Frühlings ist, ist immer noch da (und Sie können andere gute Antworten hier wiederholen), aber es gibt mehr vom Frühling ....

Spring hat jetzt viele Projekte, jedes mit einigen Unterprojekten ( http://spring.io/projects ). Wenn jemand über den Frühling spricht, muss er herausfinden, von welchem Frühlingsprojekt er spricht, ist es nur Federkern, der als Frühlingsgerüst bekannt ist , oder es ist ein weiterer Frühlingsprozeß.

Einige Frühlingsprojekte, die erwähnenswert sind, sind:

Wenn Sie weitere Funktionen für Ihre Anwendung benötigen, können Sie sie dort auch finden:

  • Feder Chargen- Framework entwickelt, um die Entwicklung von
    Chargenanwendung
  • Frühling HATEOAS einfache Erstellung von REST api Basis auf HATEOAS principal
  • spring mobile und spring andriod für die mobile Anwendungsentwicklung
  • Spring Shell eine voll ausgestattete Shell-Anwendung (aka Kommandozeile)
  • Frühlingswolke und Frühlingswolke 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 Web-Entwicklung verwenden, da es das Spring MVC Modul hat, das Teil des Frühlings-Framework- Projekts ist. Oder Sie können die Feder mit einem anderen Webrahmen verwenden, z . B. mit Streben2 .




Sehr kurz zusammengefasst, ich werde 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.

  1. Spring Handles Dependency Injection und ich empfehle Ihnen, Martin Fowler's ausgezeichnete Einführung in Dependency Injection zu lesen.
  2. Das zweite, was Spring tut, ist, exzellente Java-Bibliotheken auf sehr elegante Weise in Ihre Anwendungen zu integrieren. Ein gutes Beispiel zeigt, wie Spring Task Executors und Quartz Scheduler umhüllt.
  3. Drittens bietet Spring eine Reihe von Implementierungen von Web-Inhalten wie REST, ein MVC-Web-Framework und 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 Wrapper um andere Dinge sind wirklich gut durchdacht darin, dass die anderen Dinge alles durchdacht haben und Spring es einfach schön umhüllt. Die Spring-Implementierungen von MVC und REST und all die anderen Sachen sind nicht so gut gemacht (YMMV, IMHO), aber es gibt Ausnahmen (Spring Security ist da Bomb). Deshalb verwende ich Spring für DI, und seine coolen Wrapper bevorzugen andere Dinge für das Web (ich mag Tapestry sehr), REST (Jersey ist wirklich robust), etc.




Was Sie wahrscheinlich in einer Webanwendung mit Spring wünschen würden -

  • Spring MVC, das mit 2.5+ es Ihnen erlaubt, POJOs als Controller-Klassen zu verwenden, was bedeutet, dass Sie nicht von einem bestimmten Framework ausgehen müssen (wie in Struts oder Spring vor-2.5). Controller Klassen sind auch einfach zu testen, teilweise dank Dependency Injection
  • 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 "Formularbohnen" verwenden. Von Natur aus wird dies zu einem robusteren Domänenmodell führen, zum Teil, weil es die Anzahl der Klassen reduzieren wird.
  • Springform-Tags erleichtern das Erstellen von Formularen ohne großen Aufwand.

Darüber hinaus ist Spring riesig - es gibt also viele andere Dinge, die Sie vielleicht in einer Web-App wie Spring AOP oder Spring Security verwenden möchten. Aber die vier oben aufgeführten Dinge beschreiben die gemeinsamen Komponenten von Spring, die in einer Web-App verwendet werden.




Ich sehe zwei Teile dazu:

  1. "Was genau ist Frühling für" -> siehe die akzeptierte Antwort von Victor Hugo.
  2. "[...] Der Frühling ist [ein] guter Rahmen für die Web-Entwicklung" -> Leute, die sagen, dass es sich um Spring MVC handelt. Spring MVC ist einer der vielen Teile von Spring und ist ein Web-Framework, das die allgemeinen Merkmale von Spring nutzt, wie die Dependency Injection. Es ist ein ziemlich generisches Framework, das sehr konfigurierbar ist: Sie können verschiedene Db-Layer (Hibernate, iBatis, plain JDBC), verschiedene View-Layer (JSP, Velocity, Freemarker ...) verwenden.

Beachten Sie, dass Sie Spring in einer Webanwendung perfekt verwenden können, ohne Spring MVC zu verwenden. Ich würde sagen, die meisten Java-Web-Anwendungen tun dies, während andere Web-Frameworks wie Wicket, Struts, Seam, ...




Spring eignet sich hervorragend zum Zusammenkleben von Klassen. Sie wissen, dass Ihre Hibernate-Klassen immer eine Datenquelle benötigen, Spring verkabelt sie (und hat auch eine Implementierung der Datenquelle).

Ihre Datenzugriffsobjekte benötigen immer Hibernate-Zugriff, während Spring die Hibernate-Klassen für Sie in Ihre DAOs einbindet.

Darüber hinaus gibt Ihnen Spring im Prinzip solide Konfigurationen für eine Reihe von Bibliotheken und gibt Ihnen Hinweise darüber, welche Bibliotheken Sie verwenden sollten.

Spring ist wirklich ein großartiges Werkzeug. (Ich habe nicht über Spring MVC gesprochen, nur das Basis-Framework).




Spring ist eine gute Alternative zur Enterprise JavaBeans (EJB) -Technologie. Es hat auch Web-Framework und Web-Services-Framework-Komponente.




Der Vorteil ist Dependency Injection (DI) . Es bedeutet Outsourcing der Aufgabe der Objekterstellung. Lassen Sie mich das 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 in meinem Code habe ich 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 abhängig von unserer Stimmung Buffet () oder Plated () aus. Dieses System ist jedoch eng gekoppelt. Jedes Mal, wenn wir einen anderen Objekttyp benötigen, müssen wir den Code ändern. Kommentieren Sie in diesem Fall eine Zeile! Stellen Sie sich vor, dass 50 verschiedene Klassen von 50 verschiedenen Personen verwendet werden. Es wäre eine Hölle. In diesem Fall müssen wir das System entkoppeln. Lass uns die LunchDecide-Klasse neu schreiben.

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

Beachten Sie, dass wir, anstatt ein Objekt mit einem neuen Schlüsselwort zu erstellen, den Verweis auf ein Objekt vom Typ Mittag 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) verkabelt werden. In jedem Fall würde die Entscheidung, welcher Objekttyp erstellt werden würde, zur Laufzeit dort getroffen werden. Ein Objekt würde von Xml in unseren Code eingefügt - Unser Code ist für diesen Job 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 es ermöglicht, dass Abhängigkeiten verspottet werden. Last but not least rationalisiert DI das Aspect Oriented Programming (AOP), was zu einer weiteren Entkopplung und einer Erhöhung der Modularität führt. Beachten Sie außerdem, dass es sich bei DI über Constructor Injection handelt. DI kann auch mit Setter Injection ausgeführt werden - dieselbe einfache alte Setter-Methode aus der Kapselung.




Die akzeptierte Antwort bezieht sich nicht auf die Verwendung von Annotationen, da Spring die Unterstützung für verschiedene Annotationen für die Konfiguration eingeführt hat.

Frühlingsansatz (Dependency Injection)

Es gibt eine andere Möglichkeit, die Klassen neben einer XML-Datei zu verbinden: die Annotationen. Lassen Sie uns das Beispiel aus der akzeptierten Antwort verwenden und die Bean mit der einzigen Annotation @Bean direkt in der Klasse @Bean :

@Bean
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

Auf diese Weise wird auf magische Weise ein UserLister zur Verfügung stehen, wenn die Ansicht erstellt wird.

Die obige Aussage ist gültig mit einem kleinen Bonus, der keine Verwendung von XML-Dateien @Autowired , und die Verdrahtung mit einer anderen Annotation @Autowired , die eine relevante Implementierung findet und diese injiziert.

@Autowired
private UserLister userLister;



Der Frühling begann als ziemlich einfaches Dependency-Injection-System. 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, versuchen Sie:

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 mag alt sein, aber es ist ein ausgezeichnetes Buch.

Für ein anderes gutes Buch dieses Mal ausschließlich Frühling gewidmet 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.




Frühling war Dependency Injection am Anfang, dann fügen Sie King of Wrappers für fast alles (Wrapper über JPA Implementierungen etc).

Lange Geschichte ... die meisten Teile von Spring preffer XML-Lösungen (XML-Scripting-Engine ... brrrr), also für DI ich Guice verwenden

Gute Bibliothek, aber mit wachsendem Depnedenciec, zum Beispiel Sprong JDBC (vielleicht eine Java jdbc-Lösung mit echten Namensparametern) von Maven 4-5 weiter.

Mit Spring MVC (Teil von "Big Spring") für Web-Entwicklung ... Es ist "Anfrage basiert" Framework, gibt es den heiligen Krieg "Anfrage vs Komponente" ... bis zu Ihnen