Ich höre viel über Spring , die Leute sagen im ganzen Web, dass Spring ein guter Rahmen für die Webentwicklung ist. Wofür genau ist Spring Framework?
Ich höre viel über Spring , die Leute sagen im ganzen Web, dass Spring ein guter Rahmen für die Webentwicklung ist. Wofür genau ist Spring Framework?
Antworten:
Grundsätzlich ist der Frühling ein Rahmen für Abhängigkeitsspritze Dies ist ein Muster, mit dem sehr entkoppelte Systeme aufgebaut werden können.
Angenommen, Sie müssen die Benutzer des Systems auflisten und eine Schnittstelle mit dem Namen deklarieren 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, 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 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 Datenbank 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 erneut zu meinem Code gehen und die obige Zeile in Folgendes ändern:
UserLister userLister = new UserListerCommaSeparatedFile();
Dies ist bei einem kleinen Programm wie diesem kein Problem, aber ... Was passiert in einem Programm mit Hunderten von Ansichten und einer ähnlichen Anzahl von Geschäftsklassen? Die Wartung wird zum Albtraum!
Spring verdrahtet die Klassen mithilfe einer XML-Datei oder von Anmerkungen. Auf diese Weise werden alle Objekte von Spring instanziiert und initialisiert und an den richtigen Stellen (Servlets, Web Frameworks, Geschäftsklassen, DAOs usw. usw. usw.) injiziert ...).
Zurück zum Beispiel im Frühjahr: Wir brauchen nur einen Setter für das userLister
Feld und entweder eine XML-Datei wie diese:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
oder kommentieren Sie das in unserer Ansichtsklasse abgelegte einfach mit @Inject
:
@Inject
private UserLister userLister;
Auf diese Weise ist die Ansicht beim Erstellen auf magische Weise UserLister
betriebsbereit.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
Es ist toll! Ist es nicht?
UserLister
Schnittstelle verwenden möchten ? Ändern Sie einfach das XML.UserLister
Implementierung bereitsteht? Programmieren Sie eine zeitliche Scheinimplementierung UserLister
und erleichtern Sie die Entwicklung der Ansicht.Es gibt einige andere Optionen für die Abhängigkeitsinjektion. 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 helfen, Spring in viele andere gängige Frameworks zu integrieren, ohne es zu sein aufdringlich in Ihrer Anwendung. Außerdem hat Spring mehrere gute Teilprojekte wie Spring MVC, Spring WebFlow, Spring Security und wieder eine lange Liste von usw.
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. Nach dem Verständnis der Grundlagen einen Blick auf nehmen Frühling Dokumentation , meiner Meinung nach , es wird verwendet , um immer das beste Frühling Buch.
Spring enthält ( wie Skaffman zu Recht hervorhob ) ein MVC-Framework. Um es kurz zu erklären, hier sind meine Eingaben. Spring unterstützt die Trennung von Service-Layer, Web-Layer und Business-Layer. Am besten ist es jedoch, Objekte zu "injizieren". 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
}
}
Jetzt haben Sie in Ihrem Code eine Klasse namens RoadTrip wie folgt
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Wann immer Sie eine Instanz von Trip möchten; Manchmal möchten Sie vielleicht, dass ein SUV FourWheel initialisiert, oder manchmal möchten Sie Sedan. Es hängt wirklich davon ab, was Sie je nach Situation wollen.
Um dieses Problem zu lösen, möchten Sie ein Factory-Muster als Erstellungsmuster haben. Wo eine Fabrik die richtige Instanz zurückgibt. Schließlich erhalten Sie viel Klebercode, um Objekte korrekt zu instanziieren. Spring erledigt die Aufgabe des Klebercodes am besten ohne diesen Klebercode. Sie deklarieren Zuordnungen in XML und es werden die Objekte automatisch initialisiert. Es verwendet auch viel Singleton-Architektur für Instanzen und dies hilft bei der optimierten Speichernutzung.
Dies wird auch als Inversion Of Control bezeichnet. Andere Frameworks hierfür sind Google Guice, Pico Container usw.
Abgesehen davon verfügt Spring über ein Validierungsframework und umfassende Unterstützung für die DAO-Schicht in Zusammenarbeit mit JDBC, iBatis und Hibernate (und vielen weiteren). Bietet eine hervorragende Transaktionskontrolle über Datenbanktransaktionen.
Spring bietet noch viel mehr, 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
Früher war Spring nur ein Abhängigkeitsinjektionsrahmen wie ( Guice , PicoContainer , ...), aber heute ist es eine Komplettlösung für die Erstellung Ihrer Unternehmensanwendung .
Die Federabhängigkeitsinjektion, die natürlich das Herz des Frühlings ist, ist immer noch da (und Sie können andere gute Antworten hier überprüfen), 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 Frühling spricht, müssen Sie herausfinden, um welches Frühlingsprojekt es sich handelt, ob es sich nur um einen Federkern handelt, der als Federrahmen bekannt ist , oder um ein anderes Frühlingsprojekt.
Einige erwähnenswerte Frühlingsprojekte sind:
Wenn Sie weitere Funktionen für Ihre Anwendung benötigen, finden Sie diese möglicherweise auch dort:
Es gibt dort 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 das Spring MVC
Modul enthält, das Teil des Spring Framework- Projekts ist. Oder Sie können spring mit einem anderen Webframework wie struts2 verwenden .
Wofür ist der Frühling? Ich werde diese Frage in Kürze beantworten, aber zuerst schauen wir uns das Beispiel von Victor Hugo noch einmal an. 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 jetzt Hunderte oder Tausende von Ansichten haben, müssen Sie nur noch die eine Codezeile ändern, wie im Spring XML-Ansatz. Das Ändern einer Codezeile erfordert jedoch immer noch eine Neukompilierung, anstatt XML zu bearbeiten. Nun, mein pingeliger Freund, benutze Ant und Skript weg!
Wofür ist der Frühling? Es ist für:
Weiterführende Literatur: http://discuss.joelonsoftware.com/?joel.3.219431.12
UserLister
) benötigt. Was ist jedoch, wenn mehrere Dienste benötigt werden, die nicht von den BaseView
Kindern der verschiedenen Benutzer gemeinsam genutzt werden? Es gibt (zum Glück) keine Mehrfachvererbung in Java.
Frühling ist drei Dinge.
Das Problem ist, dass Spring DI wirklich gut durchdacht ist, die Wrapper um andere Dinge wirklich gut durchdacht sind, indem die anderen Dinge alles durchdacht haben und Spring es einfach gut einwickelt. Die Spring-Implementierungen von MVC und REST und all den anderen Dingen sind nicht so gut gemacht (YMMV, IMHO), aber es gibt Ausnahmen (Spring Security ist eine Bombe). Daher benutze ich Spring für DI und seine coolen Wrapper, bevorzuge aber andere Dinge für das Web (ich mag Tapisserie sehr), REST (Jersey ist wirklich robust) usw.
Was Sie wahrscheinlich in einer Webanwendung mit Spring wollen -
Darüber hinaus ist Spring RIESIG - es gibt also viele andere Dinge, die Sie möglicherweise in einer Web-App wie Spring AOP oder Spring Security verwenden möchten. 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 problemlos verwenden können, ohne Spring MVC zu verwenden. Ich würde sagen, dass die meisten Java-Webanwendungen dies tun, während sie andere Web-Frameworks wie Wicket, Struts, Seam, ...
Der Frühling ist großartig, um Instanzen von Klassen zusammenzukleben. Sie wissen, dass Ihre Hibernate-Klassen immer eine Datenquelle benötigen. Spring verdrahtet sie miteinander (und hat auch eine Implementierung der Datenquelle).
Ihre Datenzugriffsobjekte benötigen immer einen Ruhezustand. Spring verdrahtet die Ruhezustandsklassen für Sie in Ihre DAOs.
Darüber hinaus bietet Spring Ihnen im Grunde solide Konfigurationen einer Reihe von Bibliotheken und darin eine Anleitung, welche Bibliotheken Sie verwenden sollten.
Der Frühling ist wirklich ein großartiges Werkzeug. (Ich habe nicht über Spring MVC gesprochen, sondern nur über das Basis-Framework).
Die akzeptierte Antwort beinhaltet nicht die Verwendung von Anmerkungen, da Spring die Unterstützung für verschiedene Anmerkungen für die Konfiguration eingeführt hat.
Es gibt noch eine andere Möglichkeit, die Klassen mithilfe einer XML-Datei miteinander zu verbinden: die Anmerkungen. Nehmen wir das Beispiel von der akzeptierte Antwort verwenden und registrieren die Bohne direkt auf die Klasse eine der Anmerkungen mit @Component
, @Service
,@Repository
oder @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Auf diese Weise ist beim Erstellen der Ansicht auf magische Weise ein UserLister einsatzbereit.
Die obige Aussage gilt mit einem kleinen Bonus, ohne dass XML-Dateien verwendet und mit einer anderen Anmerkung verkabelt werden müssen @Autowired
, die eine relevante Implementierung findet und diese einfügt.
@Autowired
private UserLister userLister;
Verwenden Sie die @Bean
Annotation für eine Methode, mit der die Bean-Implementierung injiziert wird.
@Bean
Anmerkung nicht auf Klassenebene verwenden. Muss einer der folgenden sein @Component
, @Service
, @Repository
usw. Der Rest ist richtig. Sie sollten vielleicht auch darauf hinweisen, dass das automatische Verdrahten der Schnittstelle auf diese Weise nur funktioniert, wenn nur 1 Kandidatenklasse im Klassenpfad für die Injektion geeignet ist, andernfalls Spring-Anwendungsfehler.
Der Vorteil ist Dependency Injection (DI) . Es bedeutet, die Aufgabe der Objekterstellung auszulagern. Lassen Sie mich dies anhand eines Beispiels 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 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 verwendet werden. Es wäre ein verdammt großes 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 wir anstelle eines Objekts mit einem neuen Schlüsselwort den Verweis auf ein Objekt vom Typ Lunch Type als Parameter an unseren Konstruktor übergeben haben. Hier wird die Objekterstellung ausgelagert. Dieser Code kann entweder mit einer XML-Konfigurationsdatei (Legacy) oder mit Java Annotations (Modern) verkabelt werden. In beiden Fällen wird dort zur Laufzeit entschieden, welcher Objekttyp erstellt werden soll. 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 lose zu koppeln, sondern vereinfacht auch das Schreiben von Unit-Tests, da Abhängigkeiten verspottet werden können. Last but not least optimiert DI die aspektorientierte Programmierung (AOP), was zu einer weiteren Entkopplung und Erhöhung der Modularität führt. Beachten Sie auch, dass über DI die Konstruktorinjektion steht.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Spring ist eine gute Alternative zur Enterprise JavaBeans (EJB) -Technologie. Es hat auch Web-Framework und Web-Services-Framework-Komponente.
Spring begann als ein ziemlich einfaches Abhängigkeitsinjektionssystem. Jetzt ist es riesig und hat alles drin (außer dem sprichwörtlichen Spülbecken).
Aber keine Angst, es ist ziemlich modular, so dass Sie genau die Teile verwenden können, die Sie wollen.
Um zu sehen, wo alles begann, versuchen Sie:
Es mag alt sein, aber es ist ein ausgezeichnetes Buch.
Für ein weiteres gutes Buch, das diesmal ausschließlich dem Frühling gewidmet ist, siehe:
Es verweist auch auf ältere Versionen von Spring, ist aber definitiv einen Blick wert.
Der Frühling war am Anfang eine Abhängigkeitsinjektion, dann füge King of Wrapper für fast alles 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 Abhängigkeit, zum Beispiel Frühling JDBC (vielleicht eine Java-JDBC-Lösung mit Real-Names-Parametern) als nächstes von Maven 4-5.
Mit Spring MVC (Teil von "Big Spring") für die Webentwicklung ... es ist ein "anforderungsbasiertes" Framework, es gibt "Anfrage gegen Komponente" des Heiligen Krieges ... bis zu Ihnen
In der Vergangenheit habe ich aus rein technischer Sicht über Spring Framework nachgedacht.
Angesichts einiger Erfahrungen mit Teamarbeit und der Entwicklung von Unternehmens-Webapps würde ich sagen, dass Spring eine schnellere Entwicklung von Anwendungen (Webanwendungen) durch Entkopplung der einzelnen Elemente (Beans) ermöglicht. Eine schnellere Entwicklung macht es so beliebt. Mit Spring können Sie die Verantwortung für den Aufbau (die Verkabelung) der Anwendung auf das Spring-Framework übertragen. Die Abhängigkeitsinjektion des Spring-Frameworks ist für das Verbinden / Verdrahten einzelner Beans mit einer funktionierenden Anwendung verantwortlich.
Auf diese Weise können sich Entwickler mehr auf die Entwicklung einzelner Komponenten (Beans) konzentrieren, sobald Schnittstellen zwischen Beans definiert sind.
Das Testen einer solchen Anwendung ist einfach - der Hauptfokus liegt auf einzelnen Bohnen. Sie können leicht entkoppelt und verspottet werden, sodass Unit-Tests schnell und effizient sind.
Das Spring Framework definiert mehrere spezialisierte Beans wie @Controller ( @Restcontroller ), @Repository , @Component , um Webzwecken zu dienen. Spring bietet zusammen mit Maven eine Struktur, die für Entwickler intuitiv ist. Teamarbeit ist einfach und schnell, da einzelne Elemente getrennt bleiben und wiederverwendet werden können.
Spring Framework ist definitiv gut für die Webentwicklung und genauer für erholsame API-Dienste.
Es ist gut für die oben wegen seiner Dependency Injection und die Integration mit anderen Modulen wie Feder Sicherheit , Frühling AOP , MVC - Framework , Microservice
Bei jeder Anwendung ist Sicherheit höchstwahrscheinlich eine Voraussetzung.
Wenn Sie ein Produkt bauen möchten, das lange gewartet werden muss, müssen Sie das Aop-Konzept verwenden.
Wenn Ihre Anwendung zu viel Verkehr hat und somit die Last erhöht, müssen Sie das Microservices-Konzept verwenden.
Spring bietet all diese Funktionen auf einer Plattform. Unterstützung mit vielen Modulen .
Am wichtigsten ist, dass Spring Open Source und ein erweiterbares Framework ist und ü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.
So kann die Feder in nahezu jede Anforderung passen.