Gadżety Javy

Jeszcze parę lat temu mówiło się, że Spring i EJB wcale ze sobą nie konkurują. Każde z nich miało swoje obszary zastosowań, w których się sprawdzało, a drugiemu nie wchodziło w paradę. Wyhodowany na bolączkach EJB2 Spring Framework, rozwijany przez genialnych programistów z Interface21, świadomie pozbawiony był nadmiarowych bajerów EJB, przez co wypełnił tą niszę, w której potrzeba było minimalistycznego kontenera.

Z biegiem czasu dochodziły coraz to nowe dodatki: kolejne moduły, kolejne podprojekty, własny serwer aplikacji, SpringSource ToolSuite. Czy wciąż Spring i EJB mają swoje obszary stosowalności? Czy może stały się nawzajem dla siebie alternatywami? Porównajmy:

SpringFramework EJB3.*
bierzesz, co chcesz; w razie potrzeb dokładasz kolejne moduły bierzesz wszystko albo nic; klejony na siłę koncept profili moim zdaniem tak bezsensowny, że nawet nie warto się rozpisywać
częste wydania w bólach i na drodze kompromisów rodząca się specyfikacja jest sporo w tyle za nowinkami ze świata OpenSource
nastawiony na bezinwazyjne sklejanie fragmentów aplikacji oraz na integrowanie się z bibliotekami i frameworkami, które już istnieją i dobrze się sprawdzają mityczna przenośność aplikacji pomiędzy serwerami
staje się coraz cięższy; może nie sam kontener ale włączając kolejne ficzery robi się coraz ciężej zmierz w stronę odchudzania (JPA poza kontenerem, koncept profili)
Projekt OpenTerracotta spierający skalowanie aplikacji opartych o Springa kontener EJB dostarcza możliwości skalowania aplikacji
można tworzyć aplikacje wielowątkowe zakaz własnoręcznego korzystania z wątków; wątkami zarządza wyłącznie kontener
brak standardu dot. zarządzania aplikacją; istnieją projekty SpringSource dedykowane do tego celu spójny sposób zarządzania aplikacją

Okazuje się, że Spring wsparty bibliotekami zewnętrznymi potrafi zapewnić dokładnie te same funkcjonalności, że EJB. Być może jeszcze jedną różnicą jest to, że w przypadku Spring trzeba dokładnie wiedzieć jaki efekt chce się uzyskać, gdyż oferuje on bogactwo różnych opcji na rozwiązanie tego samego problemu i trzeba wiedzieć, która jest najodpowiedniejsza dla naszego projektu. W przypadku EJB, mamy wszystko out of the box.

Kontynuując tyradę narzekania
Kontynuując tę tyradę narzekanie trzeba wspomnieć jeszcze wiele genialnych frejmłorków i bibliotek, które świetnie wyglądają w 10 minutes tutorial, rozwiązują parę problemów i wprowadzają szereg nowych.
Wymieniam parę wad:

JSF ciężkie drzewo komponentów, pokręcony mechanizm renderowania; wersja 1.2 – toporna i wymagająca paru dodatków, aby sensownie pracować; wersja 2.0 – niby fajnie ale poużywamy-zobaczymy; RichFaces 4.0 wspierajace JSF 2.0 już jest
JPA wolno rozwijająca się specyfikacja, plus wszystkie wady O/RMów
GWT dostawca monopolista, ciężki klient, brak standardu, po stronie widoku obsługiwana jest tylko część maszyny wirtualnej
Struts2 „prawie” wsparcie dla Ajaxa, koszmarne adnotacji
Spring WebFlow fajny, gdy GUI ma charakter procesowo-kreatorowy, poza tym przerost formy nad treścią
Oracle ADF w tutorialach genialny, w użyciu prowadzi do prawie takiego samego bałaganu w kodzie jak przy bezmyślnym klikaniu w Borland Delphi Buildera

Co zamiast w/w?
Jakie mamy zatem mamy alternatywy? Co można używać zamiast powyższych rozwiązań. Spotkałem się z następującymi konfiguracjami:

  • Stripes + dojo + Hibernate – wychodzimy z założenia, że nie ma co liczyć na automagiczne ajaxy i jeśli chce się mieć fajne GUI to trzeba w JavaScript popracować
  • Freemarker + SpringMVC + myBatis – całkowita rezygnacja z JSP oraz pogodzenie się z faktem, że schemat bazy jest czasem tak prosty, że nie ma co przekombinowywać
  • Oracle Forms, PowerBuilder – w architekturze dwuwarstwowej
  • PHP – tak po prostu… to o wiele bardziej dojrzała technologia, niż jawowcom może się wydawać, mają nawet swoje automagiczne frejmłorki

Do czego właściwie nadaje się się JEE
Nie chcę za bardzo wyrokować, ale JEE rozważałbym wtedy, gdy…nie ma innego wyjścia, gdy z powodów historycznych (zastany stan systemu), ludzkich (umiejętności programistów) albo politycznych trzeba się decydować na tą konkretną technologię. Bardzo, ale to bardzo byłbym ostrożny, przy rozważaniu JEE dla aplikacji webowej. Dzisiaj jestem zdania, że do aplikacji strice webowych (i nic ponad to) JEE się nie nadaje: zbyt wolne, zbyt kosztowne (chociażby ze względu na wynagrodzenia programistów).

Do czego się nadaje. Oprócz wymienionych na wstępie powodów można jeszcze dorzuć szeroko rozumiany backend przy tworzeniu dużych i długotrwałych projektów o bogatym modelu – wtedy można doszukiwać się korzyści w inwestowaniu w JEE.

P.S. Wpis wyraża prywatne myśli autora, a autor nie zarzeka się, że myśli tych kiedyś nie zmieni:)

Ten post ma 6 komentarzy

  1. Anonymous

    Sam bym tego lepiej nie ujal – kolejny wpis, pod ktorym podpisuje sie wszystkimi konczynami.

  2. Krzysztof

    "P.S. Wpis wyraża prywatne myśli autora, a autor nie zarzeka się, że myśli tych kiedyś nie zmieni:) "

    Może jak wyjdzie EJB4? 😀
    Bo nie sadzę by wcześniej pojawił się powód do pokochania tej technologi. :/

  3. Łukasz Lenart

    Możesz rozwinąć co miałeś na myśli pisząć o Struts 2:
    "prawie" wsparcie dla Ajaxa, koszmarne adnotacji ?

  4. Tomek

    kombinacja Freemarker + Spring MVC (lub Spring WebFlow) + Hibernate sprawdzała się świetnie w moim przypadku

    Prostota templatów (Freemarker, Velocity) odpowiada mi dużo bardziej niż JSF-o podobne wynalazki.

  5. Zespół Fudeo

    Od paru lat mam podobne wrażenia co autor. Po wieloletnich walkach z JSF'ami, EJB'ami itp.. wróciłem do prostoty i podstaw. W moim przypadku genialnie sprawdza się kombinacja: SpringMVC + jQuery/prototype + JSP + Hibernate.
    Da się w tym pisać ajaxowe / restowe aplikacje i nikt nie przekona mnie, że potrzebny jest jakiś framework kombajn do pisania aplikacji webowych.
    Kombinacja wymienionych technologii to najlepsza równowaga wsparcia frameworka i wolności przy tworzeniu aplikacji.
    Cały czas szukam alternatywy dla Hibernate'a, który posiada niezliczoną ilość bug'ów, których rozwiązanie trwa lata świetlne.
    Przykładowa aplikacja w tym stacku technologicznym: http://www.fudeo.pl

  6. Andrzej Ludwikowski

    Myślę, że duet JSF 2.1 (a w przyszłości 2.2 z możliwością definiowania flowów) + Primefaces 3.x, tworzą dość dobre połączenie do warstwy widoku w projektach, gdzie nie zależny nam na pełnej władzy nad HTML i nie potrzebujemy się za bardzo martwić o super wydajność.

Możliwość dodawania komentarzy nie jest dostępna.