it-swarm-eu.dev

Was macht das Spring Framework? Soll ich es benutzen? Warum oder warum nicht?

Ich starte ein brandneues Projekt in Java und erwäge die Verwendung von Spring. Warum denke ich über den Frühling nach? Weil mir viele Leute sagen, ich sollte Spring verwenden! Im Ernst, jedes Mal, wenn ich versucht habe, die Leute dazu zu bringen, zu erklären, was genau Frühling ist oder was er tut, können sie mir niemals eine klare Antwort geben. Ich habe die Intros auf der SpringSource-Website überprüft und sie sind entweder sehr kompliziert oder sehr auf Tutorials ausgerichtet. Keiner von ihnen gibt mir eine gute Vorstellung davon, warum ich sie verwenden sollte oder wie sie mir das Leben erleichtern wird. Manchmal werfen die Leute den Begriff "Abhängigkeitsinjektion" herum, was mich nur noch mehr verwirrt, weil ich denke, ich habe ein anderes Verständnis davon, was dieser Begriff bedeutet.

Hier ist ein wenig über meinen Hintergrund und meine App:

Ich habe in Java für eine Weile entwickelt und Back-End-Webentwicklung durchgeführt. Ja, ich mache eine Menge Unit-Tests. Um dies zu erleichtern, mache ich normalerweise (mindestens) zwei Versionen einer Methode : Eine, die Instanzvariablen verwendet, und eine, die nur Variablen verwendet, die an die Methode übergeben werden. Die eine, die Instanzvariablen verwendet, ruft die andere auf und liefert die Instanzvariablen. Wenn es Zeit für einen Komponententest ist, verwende ich Mockito zum Verspotten rufe die Objekte auf und rufe dann die Methode auf, die keine Instanzvariablen verwendet. Das habe ich immer als "Abhängigkeitsinjektion" verstanden.

Meine App ist aus CS-Sicht ziemlich einfach. Kleines Projekt, zunächst 1-2 Entwickler. Meistens Operationen vom Typ CRUD mit einer Reihe von Suchvorgängen. Grundsätzlich eine Reihe von RESTful-Webdiensten sowie ein Web-Front-End und schließlich einige mobile Clients. Ich denke darüber nach, das Front-End in reinem HTML/CSS/JS/JQuery zu machen, also keine wirklichen Pläne, JSP zu verwenden. Verwenden von Hibernate als ORM und Jersey zum Implementieren der Webservices.

Ich habe bereits mit dem Codieren begonnen und bin sehr gespannt auf eine Demo, in der ich einkaufen und sehen kann, ob jemand investieren möchte. Zeit ist also offensichtlich von entscheidender Bedeutung. Ich verstehe, dass Spring eine ziemlich lange Lernkurve hat, und es sieht so aus, als ob eine ganze Reihe von XML-Konfigurationen erforderlich sind, die ich normalerweise wie die Pest zu vermeiden versuche. Aber wenn es mein Leben leichter machen kann und (besonders) wenn es die Entwicklung und das Testen beschleunigen kann, bin ich bereit, in die Kugel zu beißen und den Frühling zu lernen.

Also bitte. Erziehe mich. Soll ich Spring verwenden? Warum oder warum nicht?

245
sangfroid

Was macht das Spring Framework? Soll ich es benutzen? Warum oder warum nicht?

Spring ist ein Framework, mit dem Sie verschiedene Komponenten miteinander "verkabeln" können. Dies ist am nützlichsten in Fällen, in denen Sie über viele Komponenten verfügen und diese möglicherweise auf unterschiedliche Weise kombinieren oder es je nach Einstellung oder Umgebung einfach machen möchten, eine Komponente gegen eine andere auszutauschen.

Das habe ich immer als "Abhängigkeitsinjektion" verstanden.

Ich würde eine andere Definition vorschlagen:

"Entwerfen Sie Ihre Objekte so, dass sie auf eine äußere Kraft angewiesen sind, um sie mit dem zu versorgen, was sie benötigen, mit der Erwartung, dass diese Abhängigkeiten immer injiziert sind, bevor jemand danach fragt sie beginnen ihre üblichen Jobs zu erledigen. "

Vergleichen Sie das mit: "Jedes Objekt ist dafür verantwortlich, beim Start alles und jeden zu finden, was es braucht."

es sieht so aus, als ob eine ganze Reihe von XML-Konfigurationen erforderlich sind

Nun, die meisten XML-Inhalte (oder annotationsbasierten Inhalte) erzählen Spring-Inhalte wie:

  • Wenn jemand nach "HammerStore" fragt, möchte ich, dass Sie eine Instanz von example.HammerStore Erstellen und diese zurückgeben. Zwischenspeichern Sie die Instanz für das nächste Mal, da nur ein Speicher vorhanden sein muss.
  • Wenn jemand nach "SomeHammer" fragt, möchte ich, dass Sie sich nach einem "HammerStore" fragen und das Ergebnis der makeHammer() -Methode des Geschäfts zurückgeben. Do not Cache dieses Ergebnis.
  • Wenn jemand nach "SomeWrench" fragt, möchte ich, dass Sie eine Instanz von example.WrenchImpl Erstellen. Verwenden Sie die Konfigurationseinstellung gaugeAmount und fügen Sie sie in die Eigenschaft setWrenchSize() der Instanz ein. Zwischenspeichern Sie das Ergebnis nicht.
  • Wenn jemand nach "LocalPlumber" fragt, möchte ich, dass Sie eine Instanz von example.PlumberImpl Erstellen. Fügen Sie den String "Pedro" in die Methode setName() ein, setzen Sie einen "SomeHammer" in die Methode setHammer() und setzen Sie einen "SomeWrench" in die Methode setWrench(). Geben Sie das Ergebnis zurück und speichern Sie es für später im Cache, da wir nur einen Klempner benötigen.

Auf diese Weise können Sie mit Spring Komponenten verbinden, beschriften, ihre Lebenszyklen/Caching steuern und das Verhalten basierend auf der Konfiguration ändern.

Um das [Testen] zu erleichtern, erstelle ich normalerweise (mindestens) zwei Versionen einer Methode: eine, die Instanzvariablen verwendet, und eine, die nur Variablen verwendet, die an die Methode übergeben werden.

Das klingt nach viel Aufwand, was für mich nicht viel Nutzen bringt. Stellen Sie stattdessen sicher, dass Ihre Instanzvariablen protected oder Paketsichtbarkeit haben, und suchen Sie die Komponententests im selben com.mycompany.whatever - Paket. Auf diese Weise können Sie die Instanzvariablen jederzeit während des Tests überprüfen und ändern.

113
Darien

Erstens, was ist Abhängigkeitsinjektion?

Einfach. Sie haben eine Klasse, sie hat ein privates Feld (auf null gesetzt) ​​und Sie deklarieren einen öffentlichen Setter, der den Wert für dieses Feld bereitstellt. Mit anderen Worten, die Abhängigkeit der Klasse (des Feldes) wird von einer externen Klasse (über den Setter) injiziert. Das ist es. Nichts Magisches.

Zweitens kann Spring ohne XML (oder sehr wenig) verwendet werden

Wenn Sie mit Spring 3.0.5.GA oder höher eintauchen, können Sie die Abhängigkeitsinjektionsunterstützung von JDK6 + verwenden. Dies bedeutet, dass Sie Abhängigkeiten mit den Anmerkungen @Component Und @Resource Verkabeln können.

Warum überhaupt Spring verwenden?

Offensichtlich fördert die Abhängigkeitsinjektion das Testen von Einheiten sehr einfach, da alle Ihre Klassen Setter für die wichtigen Abhängigkeiten haben und diese mithilfe Ihres bevorzugten Verspottungsframeworks leicht verspottet werden können, um das erforderliche Verhalten bereitzustellen.

Abgesehen davon bietet Spring auch viele Vorlagen, die als Basisklassen dienen, damit die Verwendung der JEE-Standardtechnologien zum Kinderspiel wird. Zum Beispiel funktioniert das JdbcTemplate gut mit JDBC, das JpaTemplate macht gute Dinge mit JPA, JmsTemplate macht JMS ziemlich einfach. Das RestTemplate ist einfach fantastisch in seiner Einfachheit. Zum Beispiel:

RestTemplate restTemplate = new RestTemplate();
MyJaxbObject o = restTemplate.getForObject("https://secure.example.org/results/{param1}?param2={param2}",MyJaxbObject.class,"1","2");

und du bist fertig. Die Parameter werden eingefügt und Sie müssen nur JAXB-Anmerkungen für MyJaxbObject bereitstellen. Dies sollte keine Zeit in Anspruch nehmen, wenn Sie sie mithilfe des Maven JAXB-Plugins automatisch von einer XSD generiert haben. Beachten Sie, dass dort weder ein Casting stattfand noch ein Marshaller deklariert werden musste. Es ist alles für dich erledigt.

Ich könnte für immer über die Wunder des Frühlings schwärmen, aber vielleicht ist es das Beste, einen einfachen Code-Spike auszuprobieren, bei dem Sie versuchen, einen RESTful-Webdienst zu verkabeln, um Daten von einem injizierten DAO abzupumpen, der Transaktionen unterstützt.

69
Gary Rowe

Erstens ist Ihr Verständnis der Abhängigkeitsinjektion nicht grundlegend falsch, sondern ganz anders als das, was die meisten Menschen meinen, wenn sie den Begriff verwenden. Was Sie beschreiben, ist ein ziemlich seltsamer und unkonventioneller Weg, um Testbarkeit zu erreichen. Ich würde Ihnen raten, sich davon zu entfernen, da andere Entwickler von dieser Art von Code ziemlich verwirrt sein werden.

Abhängigkeitsinjektion, wie sie allgemein verstanden (und von Spring implementiert) wird, bedeutet, dass die Abhängigkeiten einer Klasse (z. B. eine JDBC-Datenquelle) nicht von der Klasse selbst abgerufen, sondern von einem Container "injiziert" werden, wenn die Instanz erstellt wird. Sie haben also nicht zwei Versionen jeder Methode, die die Datenquelle verwendet. Stattdessen haben Sie eine Abhängigkeitsinjektionskonfiguration, in die die "echte" Datenquelle injiziert wird, und eine, in die ein Mock injiziert wird. Wenn die Injektion über den Konstruktor oder einen Getter erfolgt, kann der Testcode die Injektion explizit ausführen.

Zweitens ist Spring nicht nur eine Abhängigkeitsinjektion, sondern eine Kernfunktionalität. Es bietet auch deklarative Transaktionen, Jobplanung, Authentifizierung und eine Reihe anderer Funktionen (einschließlich eines vollwertigen MVC-Webframeworks), die Sie möglicherweise benötigen. Es gibt andere Frameworks, die dieselbe Funktionalität bieten, aber außer Spring nur Java EE hat sie alle integriert.

29

Warum Sie Spring verwenden möchten, lesen Sie unter http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html =

Zusammenfassend :

  • J2EE-Anwendungen enthalten in der Regel zu viel "Sanitär" -Code. Viele Codeüberprüfungen zeigen wiederholt einen hohen Anteil an Code, der nichts bewirkt: JNDI-Suchcode, Objekte übertragen, Try/Catch-Blöcke zum Abrufen und Freigeben von JDBC-Ressourcen. . . . Das Schreiben und Verwalten eines solchen Installationscodes führt zu einer erheblichen Belastung der Ressourcen, die sich auf die Geschäftsdomäne der Anwendung konzentrieren sollten.

  • Viele J2EE-Anwendungen verwenden ein verteiltes Objektmodell, wenn dies unangemessen ist. Dies ist eine der Hauptursachen für übermäßigen Code und Codeduplizierung. In vielen Fällen ist es auch konzeptionell falsch. Intern verteilte Anwendungen sind komplexer als Anwendungen am selben Standort und oft viel weniger leistungsfähig. Wenn Ihre Geschäftsanforderungen eine verteilte Architektur vorschreiben, müssen Sie natürlich eine verteilte Architektur implementieren und den Kompromiss akzeptieren (und Spring bietet Funktionen, die in solchen Szenarien helfen). Sie sollten dies jedoch nicht ohne zwingenden Grund tun.

  • Das EJB-Komponentenmodell ist übermäßig komplex. EJB wurde entwickelt, um die Komplexität bei der Implementierung von Geschäftslogik in J2EE-Anwendungen zu reduzieren. Dieses Ziel ist in der Praxis nicht erreicht worden.

  • EJB wird überbeansprucht. EJB wurde im Wesentlichen für intern verteilte Transaktionsanwendungen entwickelt. Während fast alle nicht trivialen Anwendungen transaktional sind, sollte die Verteilung nicht in das grundlegende Komponentenmodell integriert werden.

  • Viele "J2EE-Entwurfsmuster" sind in der Tat keine Entwurfsmuster, sondern Problemumgehungen für technologische Einschränkungen. Übermäßiger Gebrauch der Verteilung und Verwendung komplexer APIs wie EJB haben viele fragwürdige Entwurfsmuster erzeugt. Es ist wichtig, diese kritisch zu untersuchen und nach einfacheren, produktiveren Ansätzen zu suchen.

  • J2EE-Anwendungen sind schwer zu testen. Die J2EE-APIs und insbesondere das EJB-Komponentenmodell wurden vor dem Start der agilen Bewegung definiert. Daher berücksichtigt ihr Design nicht die einfache Prüfung von Einheiten. Sowohl durch APIs als auch durch implizite Verträge ist es überraschend schwierig, Anwendungen zu testen, die auf EJB und vielen anderen J2EE-APIs außerhalb eines Anwendungsservers basieren. Unit-Tests außerhalb eines Anwendungsservers sind jedoch unerlässlich, um eine hohe Testabdeckung zu erzielen und viele Fehlerszenarien zu reproduzieren, z. B. den Verlust der Konnektivität zu einer Datenbank. Es ist auch wichtig sicherzustellen, dass Tests während des Entwicklungs- oder Wartungsprozesses schnell ausgeführt werden können, um die unproduktive Wartezeit auf die erneute Bereitstellung zu minimieren.

  • Bestimmte J2EE-Technologien sind einfach fehlgeschlagen. Der Haupttäter hier sind Entity Beans, die sich für die Produktivität und ihre Einschränkungen bei der Objektorientierung als wenig katastrophal erwiesen haben.

19
Rudy

Was macht das Spring Framework?

Der Frühling ist wie heute nicht nur ein einfacher Rahmen, sondern ein komplettes Ökosystem.

Themen des Frühlingsökosystems:

  • Spring Framework (z. B. Dependency Injection, AOP ...)

  • Frühlingswolke

  • Federdaten

  • Frühlingssicherheit

  • Spring Batch

  • Frühlingssozial

Siehe hier für eine vollständige Abdeckung des Ökosystems. Es ist möglich, Projekte auszuwählen, sodass Sie Google Guice für DI und z. Spring Security für sicherheitsrelevante Dinge. Sie müssen sich nicht in das gesamte Ökosystem einkaufen.

Das Spring-Framework selbst deckt heute hauptsächlich ab

  • Abhängigkeitsspritze

  • Aspektorientierte Programmierung einschließlich des deklarativen Transaktionsmanagements von Spring

  • Spring MVC-Webanwendung und RESTful-Webdienst-Framework

  • Grundlegende Unterstützung für JDBC, JPA, JMS

Quelle spring.io

Im Allgemeinen kann man sagen, dass Spring eine Sammlung von im Code implementierten Mustern und Praktiken ist, die dazu beitragen können, Ihren Anwendungsentwicklungszyklus zu verbessern oder zu beschleunigen.

Für das, wofür es (das Core-Framework) am bekanntesten ist, sind seine Fähigkeiten im Bereich der Abhängigkeitsinjektion . Die Feder selbst hat, was heißt Inversion des Kontrollcontainers oder kurz IoC Container oder noch kürzer der Container (für welche "Feder "wird manchmal auch verwendet).

Was ist Abhängigkeitsinjektion?

Abhängigkeitsinjektion bedeutet, dass Ihr Objekt jede Abhängigkeit von anderen Objekten über einen externalisierten Mechanismus empfängt.

Angenommen, Sie haben ein Auto. Die typische Art und Weise, wie es implementiert wird, ist:

public class Car {

    Engine e;

    public Car() { 
        e = new Engine(); 
    }

}

Das Autoobjekt ist motorabhängig. Da der Motor als Mitglied eines Autos implementiert ist, kann er nicht gegen z.B. ein Testmotor.

Jetzt kommt Abhängigkeitsinjektion ins Spiel:

public class Car {

    Engine e;

    public Car(Engine e) { 
        this.e = e; 
    }

}

Danach können Sie die Motoren wechseln. Was Sie oben sehen, heißt Konstruktorinjektion. Es gibt andere Typen wie z. Setter - Injektion oder Methode - Injektion. Wie hilft Ihnen der Frühling dabei? Mit Spring können Komponenten, die injiziert werden sollen, mit der Anmerkung @Autowired und führt die Verkabelung des injizierten Objekts automatisch durch - es ist wahrscheinlich, dass die Komponente, die Sie injizieren möchten, selbst Abhängigkeiten aufweist. Injizierbare Mittel werden sozusagen mit @Component

public class Car {

    Engine e;

    @Autowired
    public Car(Engine e) { 
        this.e = e; 
    }

}

Dies ist jedoch nur eine der vielen Funktionen, die der Frühling zu bieten hat.

Soll ich Spring verwenden? Warum oder warum nicht?

Da der Frühling nicht sehr aufdringlich ist und viele Hilfsmittel bietet, sollten Sie die Verwendung des Frühlings in Betracht ziehen. Besonders für neue Projekte ist Spring Boot sehr attraktiv. start.spring.io bietet eine benutzerfreundliche point'n'click - Schnittstelle zum Generieren einer Projektvorlage für den Einstieg. Es ist sogar möglich, curl zum Abrufen einer Vorlage zu verwenden:

curl start.spring.io

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

:: Spring Initializr ::  https://start.spring.io

This service generates quickstart projects that can be easily customized.
Possible customizations include a project's dependencies, Java version, and
build system or build structure. See below for further details.

The services uses a HAL based hypermedia format to expose a set of resources
to interact with. If you access this root resource requesting application/json
as media type the response will contain the following links:
+-----------------+-----------------------------------------+
| Rel             | Description                             |
+-----------------+-----------------------------------------+
| gradle-build    | Generate a Gradle build file            |
| gradle-project  | Generate a Gradle based project archive |
| maven-build     | Generate a Maven pom.xml                |
| maven-project * | Generate a Maven based project archive  |
+-----------------+-----------------------------------------+

...

Andererseits bieten Frameworks wie spark oder dropwizard auch einen guten Ausgangspunkt für die schnelle Erstellung von Web-Apps.

13
Thomas Junk

Früher haben wir einfache, effiziente, schnelle Anwendungen und Webdienste nur mit Java, Servlets und JSP, HTML und XML, JDBC-API geschrieben. Es war gut genug; JUnit war ein gutes Werkzeug zum Testen. Wir ruhten uns einfach aus, dass unser Code funktionierte.

Der Ruhezustand wurde eingeführt, um SQL zu vereinfachen und eine echte Zuordnung von Datenbanktabellen mit Java -Objekten) zu ermöglichen, sodass hierarchische Beziehungen in der Objektbeziehungszuordnung oder dem ORM, wie wir es nennen, wiedergegeben werden können Wir mussten das ResultSet nicht wieder einem Java Objekt oder Datentyp) zuordnen.

Struts kamen, um das Model View Controller-Muster zu unseren Web-Apps hinzuzufügen. Es war gut.

EJBs waren ein riesiger Aufwand, und Schmerzen und Anmerkungen ließen den Code wie Hühnchenkratzer aussehen, und jetzt wurde uns unschuldigen Leuten der Frühling beschert. Es scheint mir nur übertrieben.

Zum Beispiel packen wir jetzt unsere einfache jdbc-URL, Benutzer, und übergeben sie zuerst an jdbc.properties, dann an die Eigenschaften für den Ruhezustand und dann zum dritten Mal an Spring Beans!

Im Gegensatz dazu sollten Sie in Betracht ziehen, eine Verbindung dort herzustellen, wo Sie sie benötigen. Dies ist wirklich so einfach wie unten in reinem Java gezeigt. Genau das tun wir, nachdem wir all das Heißluft-Zeug mit Spring durchgearbeitet haben:

Connection connection = DriverManager.getConnection(url, user, pass);

Das ist an sich selbsterklärend, dass es eine große Sache ist, sich schnell und einfach zu wickeln, um eine einfache Sache schnell und einfach zu erledigen, ohne wirklich andere große Vorteile. Es ist, als würde man Tonnen und Tonnen Geschenkpapier um ein winziges schönes Geschenk wickeln, was sowieso alles ist, was man wirklich behält.

Ein weiteres Beispiel ist ein Batch-Update. Bei Spring handelt es sich um eine Reihe von Klassen und Schnittstellen, bevor Sie mit der JdbcTemplate ein Batch-Update durchführen können. Mit einfachem JDBC ist es einfach:

Statement statement = connection.createStatement();
statement.addBatch(sqlquery);
statement.executeBatch();

Einfacher und schneller geht es nicht.

Ich unterstütze diesen Rahmen nicht. Es tut uns leid. Wer auf der Erde will jedes Mal Injektionen, wenn er etwas braucht?

13
Uma

Es ist ein Framework, das in Java) geschrieben wurde und viele Dinge enthält, um Ihre Webanwendung funktionsfähig zu machen (z. B. Unterstützung für die Internationalisierung). Es bietet auch eine gute Möglichkeit, Ihre Anwendung in Ebenen zu strukturieren. Das spart Ihnen auf lange Sicht viel Zeit.

Ein gutes Buch, um mehr über Spring zu erfahren, ist: Expert Spring MVC und Web Flow

4
Bernard