Thomas Darimont
Erfahrenes Mitglied
Hallo!
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 ;-)
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.).
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
Na ja, bei größeren Anwendungen braucht das starten des ApplicationContexts fast genauso lange wie der start einesEs 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
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 ;-)
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.- 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
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.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.
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 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 Remotingmodell finde ich auch sehr einfach/spannend: Services können per Konfiguration zum WebService gemacht werden.
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...- Das MVC Framework macht gut Spass, obwohl ich in Struts 2 auch sehr interessante Ansätze sehe.
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.- 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.
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.- Der Kern der Anwendung bleibt View-unspezifisch. D.h. man kann eine Webanwendung auch bequem und leicht hinter einen SWT Client packen.
....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.- Es existiert ein wachsendes Ökosystem mit vielen praktischen Erweiterungen usw: WebFlow, SpringModules.
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.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
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