J2EE Einstieg?

Hallo!

Es gibt noch ein paar mehr Punkte, die Spring für 90% der Anwendungen sinnvoller erscheinen lassen oder die "bessere" Alternative seien lassen:

- Aus Tom's "kein Application Server notwendig" folgt etwas ganz wichtiges: (Unit-)Testbarkeit ohne Infrastruktur. Komponentenklassen sind direkt mit JUnit testbar, Integrationstests werden mit von Spring bereitgestellten Subklassen von UnitTest möglich
Na ja, bei größeren Anwendungen braucht das starten des ApplicationContexts fast genauso lange wie der start eines
ApplicationServers (Beispielsweise bei intensiver Verwendung von Hibernate, etc.) Aber in der Regel gehts natürlich schon ein ganzes Stückschen flotter :) Desweiteren sind IMHO gerade für Integrationstests bestimmte Infrastrukturen notwendig (Beispieliele: Datenbank muss vor dem Test mit passenden Testdaten initialisiert werden (-> DBUnit) anschlißend muss wieder aufgeräumt werden, zum Testen des Login Moduls muss der LDAP Server muss verfügbar sein, der Third Party Webservice muss zur verfügung stehen, und und und... auch wenn man sich hier mit exzessivem Mocking helfen kann bleibt man jedoch manchmal nicht von sämtlicher Infrastruktur verschohnt)
Btw. Es sind Subklassen von TestCase ;-)

- die AOP Funktionalität möcht ich auch nochmal unterstreichen. In EJB3 ist Interception, wie es da heißt, nur mit EJBs möglich (obwohl ich auch mal davon gelesen hab, eswäre auch mit Servlets möglich). Ein Witz ist eigentlich das Definieren von Interceptoren durch Annotations-> ich will durch AOP ja Aspekte gerade zentral behandeln und konfigurieren und nicht überall im Code verteilen
Wie ich bereits sagte, der Interception Mechanismus von EJB 3.0 ist quasi "the other way around" im Gegensatz zu traditionellem AOP mit einem Around Advice.

Zusätzliche Argumente / Vorteile:
- Spring skaliert nach oben und auch nach unten. Bei kleineren Projekten holt man sich nicht so schnell unnötigen Overhead ins Haus. Spring ist sehr modular aufgebaut, so
dass man auch nur die Libs braucht, die man wirklich benötigt.
Ich würde eher sagen, dass man Spring in beliebigen Ausbaustufen in der Anwendung einsetzen kann. Beispielsweise kann man sich auch nur dem IoC bedienen oder man benutzt den sukzessive nach und nach den kompletten Spring-Stack. Dies erlaubt es Spring Schrittweise einzusetzen und so die Technologie "sanft" in die Architektur einzuführen.

Das Spring Anwendungen skalieren würde ich eher in anderem Kontext sehen, nämlich in der Unterstützung der Implementierung von Verteilten System über das einfache Remoting, und die zahlreichen Clustering-Möglichkeiten über Thirdparty Produkte (GigaSpaces, JGroups etc.).

- Das Remotingmodell finde ich auch sehr einfach/spannend: Services können per Konfiguration zum WebService gemacht werden.
Das kann man mit normalen JEE 5 auch in ähnlicher Weise ;-) Viel interessanter finde ich hier die Vielfallt an zur Verfügung stehenden Remoting Methoden: RMI, RMI over IIOP, Springs HTTP Remoting, Webservices über Axis, Hessian, Burlap ode XFire etc. darüber hinaus ist es auch recht einfach eigene Remoting Stacks hinzuzufügen (haben wir gerade für JGroups gemacht).

- Das MVC Framework macht gut Spass, obwohl ich in Struts 2 auch sehr interessante Ansätze sehe.
Das Spring MVC Framework ist zur Implementierung der Präsentationsschicht (Web) einer Spring-Awendung ein guter Weg, jedoch sollte man auch erwähnen, dass es mit Spring Webflow noch eine Zusätzliches Framework gibt, mit dessen Hilfe man auch größere komplexe Page-Flows deklarativ in Form einer Statemachine modellieren kann, darüber hinaus gibts noch Support für Continuations und und und...

- Spring forciert eine gute Architektur bzw. sauberes Layering, wohingegen EJB (besonders in der 2.1er Spezifikation) eher zum grundsätzlichen Arbeiten mit Workarounds führt.
Insbesondere das Forcieren des Konzeptes gegen Interfaces zu Programmieren und konkrete Implementierungen in der Konfiguration zu verstecken macht die Anwendung sehr flexibel hinsichtlich Erweiterbarkeit und Wartbarkeit. Weiterhin erlaubt Spring eine Art Komponentisierung des Gesamtsystems, so dass man nach und nach aus kleinen Komponenten (Spring-Beans) größere komplexere Komponenten zusammenstöpseln kann.


- Der Kern der Anwendung bleibt View-unspezifisch. D.h. man kann eine Webanwendung auch bequem und leicht hinter einen SWT Client packen.
Also ich würde das eher Präsentationsschichtunabhängigkeit nennen... und die bekommt man natürlich auch nicht automatsich ;-) Man muss natürlich durch geschickte Implementierung der einzelnen Schichten diese weitestgehend unabhängig voneinender machen, Spring bietet hier durch Best Practices viel Unterstützung, jedoch muss der Entwickler immer noch wissen wie man diese richtig Umsetzt.

- Es existiert ein wachsendes Ökosystem mit vielen praktischen Erweiterungen usw: WebFlow, SpringModules.
....SpringIDE, Integration in Zahlreiche Applikationserver (Spring stellt beispielsweise die Basis der JEE 5 Implementierung im BEA Weblogic dar). Weiterhin gibt es starke Unterstützung in der Industrie durch namhafte Firmen wie BEA, Oracle und IBM.

Fazit: Spring ist das felxiblere und leichtgewichtigere Pendant zu EJB und - solang nicht extensiv auf verteilte Objekte gesetzt wird ("The first rule to distributing objects is 'Don't distribute'" - Martin Fowler ) - eigentlich das Framework der Wahl
Hochgradig Verteilte Systeme sind IMHO noch der einzige Anwendungsfall in denen EJB noch als Implementierungsbasis in betracht gezogen werden sollten, ansonsten würde ich immer zu Spring greifen.

Btw. Spring kann natürlich auch in einem normalen J2EE Server wie JBoss laufen und bietet auch support für EJBs. -> Die Entscheidung etwas zwingend mit EJB Implementieren zu wollen schließt den Einsatz von Spring natürlich nicht aus ;-)

Gruß Tom
 
@venyl:
Da haste dir aber ganz schön was vorgenommen!
Ich bin auch dabei mich in J2EE rein zu arbeiten und das ist ganz schön komplex. Dabei kann ich Java ganz gut; verstehe zumindest alle objektorientierten Konzepte.
Nachdem du Java einigermaßen drauf hast, solltest du dich vielleicht erstmal mit JSPs auseinandersetzen. Damit kannst du schon Webapplikationen erstellen und das schafft Verständnis für das Kommende: J2EE mit Application Server.
Für den Anfang reicht Eclipse ohne Zusätze. Wenn du bei den JSPs bist, sollteste dir die Eclipse WTP Plugins installieren.
 
Ein sehr interesanter Thread.

2 Fragen:
  1. Wie lange denk ihr benötigt man um sich in Spring einzuarbeiten?
  2. Wie baut man am besten modular aufgebaute Applikationen (damit es ähnlich zu RCP ist wo man einfach plugins ein- und ausstöpseln kann)?
 
Ich denke der Break Even liegt bei Spring beim Verstehen der DependencyInjection. Zum Anfang denkt man halt laufend: "WIe komm ich denn jetzt an den ApplicationContext?" Die Lösung lautet fast immer: "Brauchst du net, lass dir die benötigten Objekte einfach injizieren". Ist am Anfang etwas schwer zu verstehen, aber hat mans erstmal geschnall, will man gar nicht mehr ohne. Bei jeder manuellen Instantiierung kommt man sofort ins grübeln ;).

Die größte Hürde war für mich eigentlich die Toolproblematik. Wo kommt welche lib hin? WIe teil ich die Konfigurationsfiles am besten auf? usw. usw. Die Dokumentation von Spring ist sehr ausführlich, die API ist verhältnismäßig "überdokumentiert" ;) Das Forum ist auch sehr hilfreich. Meistens reicht eine Suche im Forum, man bekommt da eine Klasse genannt, die das beschriebene Problem irgendwie löst und den Rest erledigt man über das Studium der API für die Klasse.

Für den Einstieg empfiehlt sich IMHO auch das Buch vom Eberhard Wolff. Es gibt einen guten Überblick über die DI, Spring und AOP, das Webframework, geht jedoch nicht sonderlich in die Details.

Vielleicht nimmst du dir AppFuse oder Equinox als Startbasis (https://appfuse.dev.java.net/). Das sind Skeletons für Springprojekte, die einen Großteil schonmal vorbereitet haben.

Wenn Fragen auftauchen, stellst du die einfach ;)

Wie lang man braucht? Hm... schwirig zu sagen. Ich mag nicht von mir behaupten, schon alle Features von Spring zu beherrschen. Aber um das Gros abfackeln zu können würde ich so 1 Monat veranschlagen, Fulltimearbeit und entsprechende SE-Kenntnisse vorrausgesetzt. Als Javanewbie wirds sicher ne Weile länger dauern, wer jedoch schon Webanwendungen programmiert hat, wird Spring fressen ;)

Modularität: hm... geht in Spring im Endeffekt über die Konfiguration. WIchtig ist allerdings auch ein Design bzw. eine Architektur, die das überhaupt möglich macht. Ein Service Layer aufgeteilt in fachliche Bereiche, keine zyklischen Abhängigkeiten, Programmierung gegen Interfaces... all das sind so Kleinigkeiten. Seit kurzem gewinnt die OSGI Integration von Spring auch mehr an Popularität. Damit ist es möglich Teile von Serveranwendungen zur Laufzeit zu starten, herunterzufahren, zu konfigurieren und/oder auszutauschen. Das Ding steckt allerdings noch etwas in den Kinderschuhen.

REINHAUN!
 
Zuletzt bearbeitet:
Guten Abend zusammen,

ich will eine kleine webanwendung erstellen auf JBoss, diese Anwendung soll einfache pojos und direct mit jdbc aud DB agieret. Ich habe mir dass so vorgestellt: jsp --> pojo --> DAO --> mysql
Auf Tomact habe ich das realisiert.
Ich werde euch dankbak sein wenn Ihr mir nur ein kleins Beispiel zukommen lassen.

Viele Grüße

askon
 
Zurück