# Vorteil / Nutzen von Spring?



## mad-din (30. Jan 2010)

Hi Leute,

aus der Not heraus wurde eine Anwendung geschaffen, die eigentlich alles andere als gut ist. Die Anwendung selbst macht im Grunde nichts anderes als Daten aus einer Datenbank zu holen, die Daten in Textdateien mit speziellen Formaten für andere Anwendungen zu exportieren und die Datenbank zu erneuern. Als einziges Framework kommt momentan Hibernate zum Einsatz, alles andere sind einfache Java-Klassen. Mehr schlecht als recht programmiert, eben quick & dirty. 

Jetzt besteht etwas Luft und die Frage ist, wie man diese Software am besten angeht. Dazu habe ich mir verschiedene Frameworks angesehen und mich auch mit JavaEE ein wenig beschäftigt. Mir scheint aber JavaEE wäre hier wie mit Kanonen auf Spatzen zu schießen. Im Grunde ist es doch eine relativ schlichte Anwendung. 

Der Vorteil von Spring erschließt sich mir in dem Ganzen auch noch nicht. Welchen effektiven Vorteil bringt mir Spring? Außer, dass ich alles in POJOs verwandeln kann. Aber im Grunde sind es momentan auch einfache POJOs. Was die Spring etwas interessanter macht, ist Spring-Mail, da die Anwendung in Zukunft auch Mails verschicken soll. 

Die Anwendung selbst läuft batchmäßig ab, d.h. es gibt im Grunde keine Benutzerinteraktion. Daten aus der Datenbank holen, umformatieren, Datenbank erneuern und Mails rausschicken. Das ist alles. 

Die Frage, die sich mir jetzt stellt: Lohnt sich Spring überhaupt, gibt es irgendwelche Alternativen? 

Danke euch und viele Grüße
Martin


----------



## SegFault (31. Jan 2010)

Also für Datenbankgeschichten mit Hibernate musst du nicht unbedingt Spring nutzen. Aber Spring erleichtert dir da so einiges. Gerade was Transaktionsmanagement angeht. Wie du schon richtig angedeutet hast ist für so kleine Anwendungen JavaEE für sowas totaler Overkill. Spring bietet aber noch andere Vorteile da es in erster Linie eine Plattform für Dependency Injection ist. D.H Wer Spring beherrscht und wirklich gegen die Plattform programmiert kann sich ggf viel Arbeit Sparen. Ich selbst beherrsche das auch nur in ansatzen, ich denke das muss man einfach machen um darin besser zu werden. Das ganze würde also für Spring sprechen, je eher man damit anfängt umso eher lernt man wofür Spring noch gut ist.


----------



## mad-din (31. Jan 2010)

Hi,

erstmal danke für die Antwort. Nur, wofür ist Spring denn gut? Es mag ja sein, dass Spring - wenn man es beherrscht - viele Vorteile bietet, nur welche? Im Moment sehe ich noch keinen Grund Spring zu lernen. Konkretes Beispiel: ich hab einen Exportmanager geschrieben, der es mir erlaubt, dynamisch Exporte zu definieren. Ich kann der Klasse angeben, was für ein Typ (CSV, feste Breite, etc.) es haben soll und übergebe nur einen Array mit den Zeilen und den Dateinamen. 

Wie kann mir Spring hier helfen? DI schön und gut, aber welchen Vorteil bringt es mir?


----------



## MQue (1. Feb 2010)

>> übergebe nur einen Array
in diesem Fall DI statt new ...

Generell kann dich Spring in jedem Berech unterstützen, wie z.B.: Spring MVC, Spring AOP (Caching, Security, Transactions), Spring Persistancem Spring JMS (Remote Connection) uvm.

Ich würde mittlerweile Spring in (fast) jedem mittleren bis größeren Projekt einsetzen, du kannst die Klassen entwickeln, ohne auf das ganze Programm zu achten und wenn du mit den Klassen fertig bist, dann hängst du diese so zusammen, wie du diese benötigst -> einfach beschrieben.


----------



## byte (1. Feb 2010)

mad-din hat gesagt.:


> erstmal danke für die Antwort. Nur, wofür ist Spring denn gut? Es mag ja sein, dass Spring - wenn man es beherrscht - viele Vorteile bietet, nur welche? Im Moment sehe ich noch keinen Grund Spring zu lernen. Konkretes Beispiel: ich hab einen Exportmanager geschrieben, der es mir erlaubt, dynamisch Exporte zu definieren. Ich kann der Klasse angeben, was für ein Typ (CSV, feste Breite, etc.) es haben soll und übergebe nur einen Array mit den Zeilen und den Dateinamen.
> 
> Wie kann mir Spring hier helfen? DI schön und gut, aber welchen Vorteil bringt es mir?



Neben Dependency Injection bietet Spring für Dein Projekt noch einige Vorteile. 

Springs Hibernate Unterstützung ist sehr gut. Du kannst mit Spring die Hibernate Konfiguration auslagern und die SessionFactory per DI in Deine DAOs injiziereren. Du musst also nicht mehr - wie es in der Hibernate Doku beschrieben ist - über eine statische Methode die SessionFactory holen. Du hast damit also eine lose Kopplung und kannst ziemlich easy die Datenbank austauschen, z.B. kannst Du damit problemlos zwischen Test, QS und Prod Datenbank wechseln.
Darüber hinaus bietet Spring die Möglichkeit, Transaktionen deklarativ zu managen. Das heisst, Du definierst nur irgendwo (XML oder Annotation), welche Methoden in einer Transaktion laufen sollen und musst Dich dann nicht mehr um beginTransaction, commit und rollback kümmern.
Zusätzlich hat Spring eine db-unabhängige Exception-Hierarchie für DB Exceptions (DataAccessExceptions) und kann Hibernate Exceptions automatisch damit kapseln. Das ist sehr hilfreich, da Hibernate Exceptions gerne mal sehr nichtssagend sind.

Auch für Deine Batch-Abläufe liefert Dir Spring Hilfsmittel. Ich weiss nicht, wie Du derzeit Deine Batch Tasks startest, aber Spring bietet die Möglichkeit, POJO-Services mit Hilfe von Quartz (eine bekannte Batch Lib) laufen zu lassen.
Wahrscheinlich willst Du die Batch Abläufe auch irgendwie kontrollieren können. Spring liefert auch super Support für JMX. Man kann POJO-Services als MBeans in einen laufenden JMX Container (den erkennt Spring automatisch) integrieren.

Darüber hinaus bietet Spring noch eine Menge mehr.


----------



## megachucky (15. Feb 2010)

Hm, dann mache ich mal den Contra-Part 

JEE ist definitiv Overkill für deine Anwendung. Spring meiner Meinung nach auch nicht nötig. Wenn du Spring-Knowledge hättest, von mir aus. Aber Einarbeitung ohne Grund macht keinen Sinn... Deine Software ist ja eine "ganz normale" Standalone-Anwendung ?!


Spring bietet drei Teile: 

1) Dependency Injection --> Schafft hohe Flexibilität (und sehr viel XML-Konfiguration). --> Benötigst du für dieses kleine Projekt sicher nicht.

2) Aspekt-orientier Programmierung (Transaktionen etc.) --> Naja, deine DB-Zugriffe sind ja jetzt auch schon ACID-Prinzip --> AOP hier nicht nötig

3) Templates -->Vereinfachen das Programmieren (angeblich), z.B. für JDBC, JMS, Mail usw. --> Ich finde die Template-Syntax aber nicht so toll, aber Geschmackssache.

Soviel zu den drei Bereichen, in denen Spring den Entwickler unterstützt. 

Spring hat sicher insbesondere bei JEE 1.4 seine Daseinsberechtigung, und auch heute noch bei Projekten, wo die Flexibilität wirklich gebraucht wird. 
Ansonsten würde ich seit JEE5 und erst recht bei JEE6 nicht mehr auf Spring setzen. Ausnahme sind die Templates, falls dir die Syntax zusagt. 

Man kann nämlich durchaus auch Spring und JEE (sinnvoll) zusammen verwenden.

Falls du dich in Spring einarbeiten willst: Spring in Action ist ein super Buch, erklärt alle drei Bereich gut, und auch neutral (d.h. ohne Bashing auf JEE - das nervt nämlich in vielen Blogs etc sehr)...


----------



## byte (16. Feb 2010)

Das beste Spring Buch ist imo: APRESS.COM : Spring Recipes: A Problem-Solution Approach : 9781590599792


----------



## Generic1 (16. Feb 2010)

Ich hab ein Buch über Spring 2.0 gelesen und vor kurzem die ppt eines Vortrages über Spring 3.0 gelesen.
Alles was hängen geblieben ist -> Spring 3.0 bietet noch bessere Unterstützung bzgl. Annotations und Spring MVC und EL.
Wie kann ich mich am Besten auf 3.0 updaten?


----------



## maki (16. Feb 2010)

Generic1 hat gesagt.:


> Wie kann ich mich am Besten auf 3.0 updaten?


Doku lesen und das gelernte einsetzen.


----------



## Generic1 (16. Feb 2010)

Muss/Darf mich in den nächsten Wochen auch mit OSGi beschäftigen, und bin jetzt am überlegen, ob ich mir ein OSGi- buch kaufe oder ob ich gleich die Spezifikation lese, wie schätzt ihr das ein, kann man die Spezifikation verstehen ohne ein OSGi Buch gelesen zu haben und mit den basic Basics von OSGi (Module = Bundels, hohe Kohäsion, geringe Kopplung)?


----------



## maki (16. Feb 2010)

IMHO sind die OSGi Specs eher etwas für Leute die eine OSGi Plattform implementieren wollen, es gibt aber genug Tutorials im Netz um die Grundlagen zu verstehen, zB: Hello, OSGi, Part 1: Bundles for beginners - JavaWorld (ist von 2008)

Oder meinst du Eclipse RCP?


----------



## Generic1 (16. Feb 2010)

Wie hängt dann Domain Driven Design mit OSGi zusammen. DDD soll innerhalb der Module/Bundles stattfinden oder splittet man das Problem in Teilprobleme (Bundles) auf um Domain Driven Design zu erreichen?
Ich kann den Zusammenhang jetzt nicht herstellen, mir ist klar das DDD was mit kommunikation, verständnis der Domain, bestmögliche Abbildung der Domain auf die SW zu tun hat aber wie?


----------



## maki (16. Feb 2010)

DDD hat nix direkt mit OSGi zu tun, oder JEE, oder Spring, oder Java ...

OSGi ist ein Modulsystem für Java, konzentriere dich doche rstmal auf eine Sache, sonst bist du zum Schluss nur sehr verwirrt 
Anders ausgedrückt: Nicht alles auf einmal lernen wollen erhöht die Erfolgschancen.


----------



## megachucky (16. Feb 2010)

Und Spezifikationen sind fast immer ne Katastrophe, um eine Technologie zu lernen. Sofern es schon Bücher zu einer Technologie gibt, würde ich diese immer bevorzugen!

Wenn man dann Erfahrung hat, findet man für ein konkretes Problem fast immer in der Spec eine Antwort, aber zum Lernen sind sie selten geeignet...


----------



## dmike (16. Feb 2010)

megachucky hat gesagt.:


> Spring hat sicher insbesondere bei JEE 1.4 seine Daseinsberechtigung, und auch heute noch bei Projekten, wo die Flexibilität wirklich gebraucht wird.
> Ansonsten würde ich seit JEE5 und erst recht bei JEE6 nicht mehr auf Spring setzen. Ausnahme sind die Templates, falls dir die Syntax zusagt.



Sehe ich auch so.  EJB3 hat Spring etwas den Wind genommen. 

Für so ein mini ETL Projekt braucht man keine Framework. 

Aber: Wenn man keine Angst vor XML hat macht das entwickeln gegen Spring echt Spaß, vorallem wenn man den ganzen anderen Krempel wegläßt und sich nur auf die DB Schicht und DI beschränkt.
Man vergißt keine offenen JDBC Conn. mehr das lästige Abfangen von SQL Ex wird einem auch abgenommen. Der Code wirkt klar strukturiert (wg DI) und aufgeräumt (kein "boilerplate") . Das Projekt dokumentiert sich quasi selbst in der Bean Konfiguration. Da steht alles drin was man wissen muss, um einem anderen die Codebasis in kurzer Zeit erklären zu können. Ich würde als zu DB Schicht und zu Spring-Core raten. Das lohnt sich auch für kleine Sachen. Spring wächst mit den eigenen Anforderungen. Problematsch wird's wenn man irgendwann zuviel in Spring reinpackt => Jar Hölle.


----------



## Atze (16. Feb 2010)

bei thema rcp entwicklung hilft spring auch die anhängigkeiten der bundles aufzulösen, bzw übernimmt dies mit spring dm komplett


----------



## maki (16. Feb 2010)

... und nicht zu vergessen die Templates für Unittests etc. pp.

JEE mag zwar einiges von Spring übernommen haben, aber überflüssig ist Spring noch lange nicht, speziell für neue Technologien bietet Spring meist etwas an.


----------



## fkh (17. Feb 2010)

Hallo,

zum Thema OSGi allgemein (kein RCP, keine direkte Verknüpfung mit Spring) kann ich dir nur dieses Buch hier wärmstens empfehlen (ist zudem auch noch in Deutsch): Die OSGI Service Platform-Eine Einführung mit Eclipse Equinox

Das Buch setzt auf Eclipse/Equinox 3.3 auf, allerdings konnte ich alle Projekte ohne Anpassungen mit der aktuellen Eclipse/Equinox 3.5.1 umsetzen. Grundsätzlich bin ich der Meinung, dass man erstmal ein allgemeines OSGi-Wissen haben sollte und dann den Sprung zu Spring-DM gehen kann. Anderenfalls kann es passieren, dass einem wichtige Basics fehlen was dann wiederum zu Frustsituationen führen kann und der Schwung rüber zu DM ist später wirklich kein großer Akt mehr.

Ene Empfehlung für ein gutes Springbuch hat dir byte ja schon gegeben. Ansonsten wenn du die Vorteile von Spring wissen willst, interessiert dich u. U. auch eine Abhandlung über DI im allgemeinen. Hierfür gibt es folgendes Buch (hab ich bisher nur kurz reingeschaut, macht aber einen guten ersten Eindruck): Dependency Injection

Zudem gibt es noch Bücher speziell zu Spring DM:

Modular Java: Creating Flexible Applications with Osgi and Spring (Pragmatic Programmers) 
Hab das mal überflogen und sah ganz brauchbar aus. Allerdings setzt der Autor pax runner für die Beispiele ein. Wer das nicht mag, hat es vermutlich als Anfänger etwas schwierig, die Sachen anderweitig zum Laufen zu bekommen.

und 

Pro Spring Dynamic Modules for OSGi™ Service Platforms

Auch das hab ich mal kurz überflogen, fande ich persönlich nicht ganz so gut wie das vorangegangene Werk (aber wie gesagt, ich hab beide Bücher bisher nur mal kurz überflogen und noch n icht genauer betrachtet).

Ansonsten wäre meine Empfehlung, dass du dir das von byte vorgestellte Buch Spring Recipes zusammen mit dem OSGi/Equinox-Buch zulegst. Denke damit erhälst du schon einen sehr guten Einblick in Spring und OSGi.

Gruß
fkh


----------

