Spring Framework – szkielet tworzenia aplikacji (ang. application framework) w języku Java dla platformy Java Platform, Enterprise Edition (aczkolwiek istnieje też wersja dla środowiska .NET).

Spring Framework
logo
Ilustracja
Autor Pivotal Software
Pierwsze wydanie 2002-10-01T00:00:00.001 1 października 2002(dts)
Aktualna wersja stabilna 6.1.4
(15 lutego 2024) [±]
Język programowania Java
Rodzaj framework
Licencja Apache License 2.0
Strona internetowa

Spring Framework powstał na bazie kodu opublikowanego w książce Roda Johnsona Design and Development (ISBN 0-7645-4385-7). Pozytywny odzew czytelników sprawił, że był on dalej rozwijany przez autorów (m.in. Johnsona, Juergena Hoellera), którzy postanowili założyć firmę Interface21, świadczącą usługi konsultingowe związane z tym szablonem.

Pierwsze wydanie Spring Framework pojawiło się w październiku 2002 roku na bazie licencji „Apache 2.0 license”. Wersja 1.0 ukazała się w marcu 2004 roku.

Spring Framework powstał jako alternatywa dla programowania aplikacji z użyciem Enterprise JavaBeans. Programowanie z użyciem EJB narzucało wiele ograniczeń – wymagając między innymi przyjęcia określonego modelu tworzenia oprogramowania. Funkcjonalność EJB okazała się także za „ciężka” do wszystkich zastosowań (w małych projektach wykorzystywano tylko niewielką część oferowanej przez EJB funkcjonalności) jednocześnie stworzenie małej aplikacji w środowisku EJB wymagało nakładu pracy jak przy aplikacji dużej. Odmienna koncepcja Springa – lekkiego szablonu, który nie wymusza specyficznego modelu programowania, stała się bardzo popularna wśród programistów Javy. Spring Framework oferuje dużą swobodę w tworzeniu rozwiązań, a jednocześnie jest dobrze udokumentowany i zawiera rozwiązania wielu zagadnień, często występujących w programowaniu.

Podczas gdy bazowe komponenty Springa mogą być używane praktycznie w każdej aplikacji, istnieje w nim wiele rozszerzeń, które pozwalają budować aplikacje webowe na bazie Java EE.

Wprowadzenie do szablonu Spring Framework edytuj

Szablon Spring Framework zawiera rozwiązania dla wielu zagadnień technicznych napotykanych przez programistów języka Java oraz organizacji chcących budować aplikację na platformie Java EE. Mnogość komponentów, które zawiera Spring, powoduje, że czasami trudno je rozróżnić. Spring Framework nie jest powiązany tylko i wyłącznie ze środowiskiem Java EE, aczkolwiek jego integracja w tym obszarze jest ważnym powodem jego popularności.

Oferuje cechy, które pozwalają w łatwiejszy sposób tworzyć złożone systemy z pominięciem modeli programowania, które wymuszały historyczne rozwiązania. Oprócz tego jest ceniony za wypromowanie wcześniej niedocenianych funkcji i wprowadzenie ich do powszechnie stosowanych praktyk.[potrzebny przypis]

Moduły szablonu Spring Framework edytuj

Spring Framework może być rozważany jako zbiór pomniejszonych szablonów lub „szablon zbudowany z szablonów”. Większość z tych szablonów została zaprojektowana, aby pracować niezależnie, aczkolwiek użycie ich razem zapewnia większą funkcjonalność. Szablony te można podzielić ze względu na podstawowe komponenty:

  • kontener IoC
  • szablon programowania aspektowego
  • szablon dostępu do danych
  • szablon obsługi transakcji
  • szablon Model-Widok-Kontroler
  • szablon zdalnego dostępu
  • szablon autoryzacji i uwierzytelniania
  • szablon zdalnego zarządzania JMX
  • szablon komunikatów JMS
  • szablon obsługi testowania

Odwrócenie sterowania – kontener IoC edytuj

Spring Framework zapewnia bazujące na JavaBeans zarządzanie konfiguracją przez stosowanie zasad Odwrócenia sterowania (ang. Inversion-of-Control, IoC). Pozwala to na szybsze i prostsze składanie aplikacji. IoC kojarzone jest także z „Wstrzykiwaniem zależności” (ang. Dependency Injection), aczkolwiek to drugie jest pojęciem węższym.

Zasady IoC używane są w Springu jako technika, która pozwala przekazać na zewnątrz (ang. externalize) tworzenie i zarządzanie zależnościami pomiędzy komponentami programu – zależności konfigurowane są w pliku, a zarządzanie wykonywane jest przez kontener IoC.

Przykładowo: wykonanie pewnej operacji przez klasę Foo zależy od instancji klasy Bar. W tradycyjnym podejściu, klasa Foo musiałaby stworzyć instancję klasy Bar używając operatora new lub otrzymać taką instancję z klasy fabrykującej. W podejściu IoC, instancja klasy Bar dostarczana jest do Foo w czasie wykonania programu przez zewnętrzny proces (kontener wstrzykuje zależność do klasy Foo).

Szablon programowania aspektowego edytuj

Spring Framework zapewnia obsługę programowania aspektowego (ang. Aspect Oriented Programming, AOP) zapewniające takie usługi jak zarządzanie transakcjami. AOP dostarcza możliwości zaimplementowania wspólnej logiki, która dotyka wielu miejsc w jednym miejscu i automatyczne jej dodawanie, tam, gdzie jest potrzebna[a].

Szablon dostępu do danych edytuj

Warstwa abstrakcji JDBC, opakowuje standardowy mechanizm JDBC rzucając znaczące wyjątki zorganizowane w hierarchię (nie ma potrzeby wyciągania kodów dostawcy z wyjątku SQLException). Podejście to znacznie redukuje ilość kodu, którą musi napisać programista, aby obsłużyć błędy. Nie ma potrzeby pisania kolejnych bloków finally. Wyjątki związane z JDBC są zgodne z hierarchią wyjątków generycznego obiektu dostępu do danych (DAO) w Springu.

Ta sama warstwa abstrakcji pozwala integrować aplikację z Hibernate, Java Data Objects oraz mapami SQL iBATIS-a: w sensie uchwytów do zasobów, obsługi obiektów dostępu do danych i strategii transakcji. Obsługa Hibernate z mnóstwem udogodnień IoC, które wspomagają typowe zagadnienia integracji Hibernate z aplikacjami. Wszystkie one są zgodne z generycznymi hierarchiami wyjątków w transakcjach i DAO.

Szablon zarządzania transakcjami edytuj

Spring Framework zapewnia generyczną warstwę abstrakcji (ang. generic abstraction layer) dla zarządzania transakcjami. Pozwala na dołączanie własnych komponentów zarządzających transakcjami (ang. transaction manager) i łatwe odgraniczenie transakcji bez zagłębiania się w niskopoziomowe szczegóły.

Spring Framework udostępnia generyczne strategie dla Java Transaction API (JTA) oraz pojedynczych źródeł (DataSource) Java Database Connectivity (JDBC). W odróżnieniu od czystego JTA lub EJB CMT, obsługa transakcji przez Springa nie wymaga uruchamiania środowiska Java EE (kontenera).

Szablon Model-Widok-Kontroler edytuj

Spring Framework zapewnia elastyczny trójpowłokowy[b] szablon Model-Widok-Kontroler (MVC), zbudowany na bazowej funkcjonalności Springa. Programiści otrzymują wysoki stopień kontroli nad szablonem poprzez interfejsy strategii (ang. strategy interfaces). Obsługuje on wiele technologii, w tym: strony JSP, FreeMarker, Velocity, Tiles, iText, Apache POI. Środkową powłokę można łatwo połączyć z powłoką innego szablonu MVC, w tym Apache Struts, WebWork albo Tapestry.

Problem z wzorcem projektowym MVC polega na stworzeniu przejrzystego szablonu dla stworzenia części Modelu (np. w Apache Struts). Możliwość współpracy Springa z takimi wzorcami oznacza, że programiści mogą szybko zrefaktorować (ang. refactoring) nieudaną implementację i używać springowej warstwy abstrakcji JDBC.

Uwagi edytuj

  1. AOP, działa na zasadzie Dynamicznego Proxy (ang. Dynamic Proxy, dynamicznego – w sensie tworzenia go w czasie wykonania programu). Przykładowo, za pomocą AOP można do mutatorów (ang. setters, mutators) klasy DAO automatycznie dodać fragmenty kodu zarządzające transakcjami. AOP działa na zasadzie wzorca dekorator, który w tym przypadku dekoruje metody klasy dodatkowym kodem wykonywanym fabrykując proxy. Proxy to opakowuje istniejący obiekt DAO; wywołanie metod DAO przez stworzony AOP obiekt opakowujący wywołuje dodatkowo kod zarządzający transakcjami.
  2. Pojęcie powłoka (ang. tier) jest tu używane do rozróżnienia od pojęcia warstwa (ang. layer). W języku polskim przyjęło się mieszać te dwa pojęcia.

Bibliografia edytuj

  • J2EE Development Without EJB, Rod Johnson, Jürgen Höller, Wiley, 2004, ISBN 0-7645-5831-5
  • Professional Java Development with the Spring Framework, Rod Johnson, Jürgen Höller, Alef Arendsen, Thomas Risberg, Colin Sampaleanu, Wiley, 2005, ISBN 0-7645-7483-3

Linki zewnętrzne edytuj