CodeGym /Blog Java /Random-PL /Wiosna dla leniwych Podstawy, podstawowe pojęcia i przykł...
John Squirrels
Poziom 41
San Francisco

Wiosna dla leniwych Podstawy, podstawowe pojęcia i przykłady z kodem. Część 1

Opublikowano w grupie Random-PL
Wiosna dla leniwych Podstawy, podstawowe pojęcia i przykłady z kodem.  Część 1 - 1W tym artykule nie powiem ci, jak uruchomić działający projekt Springa w 5 minut przy użyciu mojego kodu. Napiszę tylko podstawy — rzeczy, o których możesz nie wiedzieć, a mimo to stworzyć projekt. Ale w tym artykule nadal nie zrozumiesz, co się dzieje i, co ważniejsze, dlaczego.

Czym jest Spring Framework?

Spring Framework, lub po prostu Spring, to jeden z najpopularniejszych frameworków do tworzenia aplikacji internetowych w Javie. Framework jest jak biblioteka (być może znasz ten termin lepiej), ale jest coś do rozważenia. Z grubsza mówiąc, kiedy korzystasz z biblioteki, po prostu tworzysz instancje zawartych w niej klas, wywołujesz potrzebne metody i w ten sposób uzyskujesz oczekiwany wynik. Innymi słowy, jest to bardziej imperatywne podejście: w swoim programie wyraźnie wskazujesz konkretny moment, w którym musisz utworzyć jaki obiekt, kiedy wywołać konkretną metodę itp. W przypadku frameworków sytuacja wygląda nieco inaczej. Po prostu piszesz własne klasy i zapisujesz w nich pewną logikę, ale potem sam framework tworzy instancje twoich klas i wywołuje ich metody. Twoje klasy zazwyczaj implementują niektóre interfejsy z frameworka lub dziedziczą niektóre z jego klas, zapewniając w ten sposób pewną funkcjonalność, która została już dla Ciebie napisana. Ale nie zawsze tak jest. Na przykład Spring stara się w jak największym stopniu unikać tak ścisłego łączenia (gdzie twoje klasy zależą bezpośrednio od klas/interfejsów w ramach). W tym celu wykorzystuje adnotacje. Wrócimy do tego później. Ale ważne jest, aby zrozumieć, że Spring to tylko zbiór klas i interfejsów, które są dostępne do użycia :) Chcę też od razu zauważyć, że Spring może być używany nie tylko w aplikacjach internetowych, ale także w najpopularniejszych programach konsolowych które są tak dobrze znane każdemu z nas. I nawet dziś napiszemy jedną z nich. zapewniając w ten sposób pewną funkcjonalność, która została już dla Ciebie napisana. Ale nie zawsze tak jest. Na przykład Spring stara się w jak największym stopniu unikać tak ścisłego łączenia (gdzie twoje klasy zależą bezpośrednio od klas/interfejsów w ramach). W tym celu wykorzystuje adnotacje. Wrócimy do tego później. Ale ważne jest, aby zrozumieć, że Spring to tylko zbiór klas i interfejsów, które są dostępne do użycia :) Chcę też od razu zauważyć, że Spring może być używany nie tylko w aplikacjach internetowych, ale także w najpopularniejszych programach konsolowych które są tak dobrze znane każdemu z nas. I nawet dziś napiszemy jedną z nich. zapewniając w ten sposób pewną funkcjonalność, która została już dla Ciebie napisana. Ale nie zawsze tak jest. Na przykład Spring stara się w jak największym stopniu unikać tak ścisłego łączenia (gdzie twoje klasy zależą bezpośrednio od klas/interfejsów w ramach). W tym celu wykorzystuje adnotacje. Wrócimy do tego później. Ale ważne jest, aby zrozumieć, że Spring to tylko zbiór klas i interfejsów, które są dostępne do użycia :) Chcę też od razu zauważyć, że Spring może być używany nie tylko w aplikacjach internetowych, ale także w najpopularniejszych programach konsolowych które są tak dobrze znane każdemu z nas. I nawet dziś napiszemy jedną z nich. Spring stara się jak najbardziej uniknąć tak ścisłego sprzężenia (gdzie twoje klasy zależą bezpośrednio od klas/interfejsów w ramach). W tym celu wykorzystuje adnotacje. Wrócimy do tego później. Ale ważne jest, aby zrozumieć, że Spring to tylko zbiór klas i interfejsów, które są dostępne do użycia :) Chcę też od razu zauważyć, że Spring może być używany nie tylko w aplikacjach internetowych, ale także w najpopularniejszych programach konsolowych które są tak dobrze znane każdemu z nas. I nawet dziś napiszemy jedną z nich. Spring stara się jak najbardziej uniknąć tak ścisłego sprzężenia (gdzie twoje klasy zależą bezpośrednio od klas/interfejsów w ramach). W tym celu wykorzystuje adnotacje. Wrócimy do tego później. Ale ważne jest, aby zrozumieć, że Spring to tylko zbiór klas i interfejsów, które są dostępne do użycia :) Chcę też od razu zauważyć, że Spring może być używany nie tylko w aplikacjach internetowych, ale także w najpopularniejszych programach konsolowych które są tak dobrze znane każdemu z nas. I nawet dziś napiszemy jedną z nich. ) Chcę też od razu zauważyć, że Springa można używać nie tylko do aplikacji internetowych, ale także do najpopularniejszych programów konsolowych, które są nam wszystkim znane. I nawet dziś napiszemy jedną z nich. ) Chcę też od razu zauważyć, że Springa można używać nie tylko do aplikacji internetowych, ale także do najpopularniejszych programów konsolowych, które są nam wszystkim znane. I nawet dziś napiszemy jedną z nich.

Struktura

Ale Spring to nie tylko jeden konkretny framework. Jest to raczej powszechna nazwa używana w odniesieniu do kilku małych frameworków, z których każdy wykonuje swój własny rodzaj pracy. Wiosna dla leniwych Podstawy, podstawowe pojęcia i przykłady z kodem.  Część 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Rysunek 2.1. Omówienie Spring Framework

Jak widać, Spring jest modułowy. Dzięki temu możemy łączyć tylko te moduły, których potrzebujemy do naszej aplikacji, a nie łączyć tych, których oczywiście nie będziemy używać. O ile wiem, to właśnie takie podejście pozwoliło Springowi wyprzedzić swojego ówczesnego konkurenta (EJB) i objąć prowadzenie. Aplikacje korzystające z EJB ciągnęły za sobą wiele zależności, przez co okazywały się powolne i powolne. Obrazek pokazuje, że Spring Framework składa się z kilku modułów:
  • Dostęp do danych
  • Sieć
  • Rdzeń
  • i więcej
Dzisiaj zapoznamy się z niektórymi pojęciami zawartymi w module głównym: ziarna, kontekst i inne. Jak można się domyślić, moduł Data Access zawiera narzędzia do pracy z danymi (głównie bazami danych), a moduł Web do pracy w sieci (w tym do tworzenia aplikacji webowych, o czym będzie mowa w dalszej części). Ponadto istnieje kompleksowa infrastruktura obsługująca Spring: wiele innych projektów, które nie są oficjalnie włączone do samego frameworka, ale są bezproblemowo zintegrowane z twoim projektem Spring (na przykład Spring Security, który mam nadzieję poruszyć, jest przeznaczony dla uwierzytelnianie użytkownika na stronie internetowej).

Dlaczego Java ma Spring Framework?

Cóż, poza tym, że jest modny, zgrabny i świeży, mogę od razu powiedzieć, że gdy tylko zdobędziesz choć odrobinę umiejętności korzystania ze Springa, zrozumiesz, jak wiele rodzajów pracy już nie masz do zrobienia i ile pracy bierze na siebie Wiosna. Możesz napisać kilkadziesiąt wierszy ustawień konfiguracyjnych i napisać kilka klas, a otrzymasz działający projekt. Ale gdy tylko zaczniesz się zastanawiać, ile rzeczy jest pod maską, ile pracy jest w toku i ile kodu musiałbyś napisać, gdybyś miał realizować ten sam projekt w oparciu o zwykłe serwlety lub gniazda i czystą Javę, włosy staną Ci dęba :) Wiosna jest nawet opisywana jako swego rodzaju magia. Doświadczasz tego, gdy widzisz, że wszystko działa, ale masz również ogólne pojęcie o tym, jak i ile pracy dzieje się za kulisami — więc wydaje się, że naprawdę jest w tym jakaś magia :) Łatwiej nazwać to magią, niż próbować wyjaśnić, jak to wszystko jest ze sobą powiązane. :) Drugim argumentem przemawiającym za studiowaniem Springa jest to, że około 90% ofert pracy dla młodszych programistów (na podstawie moich osobistych obserwacji) wymaga znajomości lub przynajmniej ogólnego pojęcia o tym, czym jest SpringData, Web MVC, a Securitymoduły oferują wyrafinowani programiści :) Ale dziś tylko o podstawach.

DI/IOC

Jeśli kiedykolwiek próbowałeś czytać o Springu, pierwszą rzeczą, z którą się spotkałeś, były prawdopodobnie te akronimy: DI/IoC. Teraz gorąco polecam zrobić sobie przerwę od tego artykułu i przeczytać ten artykuł DZone ! IoC oznacza odwrócenie kontroli. Wspomniałem już o tym mimochodem, kiedy pisałem, że korzystanie z biblioteki wiąże się z koniecznością wskazania w kodzie, którą metodę wywołać z jakim obiektem, ale użycie frameworka ogólnie oznacza, że ​​framework wywoła twój kod we właściwym czasie. Innymi słowy, w tym drugim przypadku nie zarządzasz już procesem wykonywania kodu/programu — framework robi to za Ciebie. Przekazałeś kontrolę frameworkowi (odwrócenie kontroli). DI oznacza wstrzykiwanie zależności. Dzięki wstrzykiwaniu zależności nie tworzysz obiektów typu cat w metodzie main, a następnie przekazujesz je do swoich metod. Zamiast tego Spring Framework tworzy je za Ciebie. Po prostu mówisz coś w stylu „Chcę tu mieć kota”, a framework przekazuje ci jednego w swojej metodzie. Ten skrót zobaczymy w kolejnych artykułach.

Fasola i kontekst

Jednym z kluczowych pojęć w Springu jest fasola. W rzeczywistości jest to tylko obiekt jakiejś klasy. Załóżmy, że mamy program, który wymaga 3 obiektów: kota, psa i papugi. I mamy kilka klas z wieloma metodami. Czasami potrzebujemy kota do metody, czasami potrzebujemy psa do innej metody, a czasami nasze metody wymagają zarówno kota, jak i papugi (na przykład metoda karmienia kota, ha-ha). W przypadku jeszcze innych metod potrzebne są wszystkie trzy obiekty. Tak, moglibyśmy najpierw stworzyć te trzy obiekty w metodzie main, a następnie przekazać je naszym klasom, a następnie w ramach tych klas przekazać je odpowiednim metodom… I tak przez cały program. Ale jeśli założymy również, że od czasu do czasu chcemy zmienić listę parametrów wejściowych dla naszych metod (np. zdecydujemy się coś przepisać lub dodać nową funkcjonalność), to będziemy musieli wprowadzić sporo zmian w kodzie. A teraz wyobraź sobie, że mamy nie 3, ale 300 takich obiektów. Jedną alternatywą byłoby zebranie wszystkich naszych obiektów na jednej liście (List<Object>), przekaż go do każdej metody, a następnie pobierz potrzebny obiekt wewnątrz metod. Ale gdy program działa, co się stanie, jeśli jakiś obiekt zostanie dodany do tej listy lub, co gorsza, co się stanie, jeśli jeden zostanie usunięty? Może to złamać każdą metodę, w której używamy indeksu do pobierania obiektów z listy. Aby uniknąć tego problemu, zdecydowaliśmy się przechowywać nasze obiekty nie na liście, ale na mapie, gdzie kluczem jest nazwa obiektu, a wartością sam obiekt. To pozwala nam pobrać potrzebne obiekty po prostu używając ich nazwy, np. get("papuga"), aw odpowiedzi otrzymujemy obiekt papugi. Lub kluczem może być klasa obiektu, a wartością sam obiekt. W tym przypadku, zamiast określać nazwę obiektu, możemy po prostu określić klasę obiektu, którego potrzebujemy. To też jest wygodne. Lub moglibyśmy nawet napisać coś w rodzaju opakowania dla mapy, w którym niektóre metody pobierają obiekty według ich nazw, a inne metody pobierają obiekty według ich klas. To, do czego tu doszliśmy, nazywa siękontekst aplikacji w Spring Framework. Kontekst to zbiór fasoli (obiektów). Uzyskujemy dostęp do kontekstu, aby uzyskać potrzebny komponent bean (obiekt) według jego nazwy, typu lub w inny sposób. Dodatkowo możemy poprosić samego Springa, aby poszukał we własnym kontekście potrzebnego nam komponentu bean i przekazał go naszej metodzie. Załóżmy na przykład, że mamy taką metodę:

public void doSomething(Cat cat) {
    ...
}
Kiedy Spring wywołał tę metodę, wziął nasz obiekt cat z kontekstu i przekazał go do metody. Ale teraz zdecydowaliśmy, że oprócz kota, nasza metoda potrzebuje również papugi. Z wiosną nic nie może być prostsze! Po prostu piszemy:

public void doSomething(Cat cat, Parrot parrot) {
    ...
}
Teraz, kiedy Spring wywołuje naszą metodę, rozumie potrzebę przekazania kota i papugi, więc przechodzi do swojego kontekstu, pobiera te dwa obiekty i przekazuje je do naszej metody. Przekazując stery kontroli Springowi, przekazujemy również odpowiedzialność za tworzenie obiektów i przekazywanie ich naszym metodom, które Spring wywoła. To nasuwa pytanie: skąd Spring wie, które obiekty (fasole) utworzyć?

Sposoby konfigurowania aplikacji

Istnieją trzy główne sposoby konfigurowania aplikacji , czyli sposoby poinformowania Springa, jakich dokładnie obiektów potrzebujemy:
  1. Pliki konfiguracyjne XML
  2. Konfiguracja oparta na Javie
  3. automatyczna konfiguracja
Twórcy Springa traktują je priorytetowo w następującej kolejności:
  • metodą o najwyższym priorytecie, którą należy preferować, jest konfiguracja automatyczna
  • jeśli nie można użyć automatycznej konfiguracji do poprawnego skonfigurowania wszystkich możliwych komponentów bean, użyj konfiguracji opartej na Javie (która obejmuje tworzenie obiektów przy użyciu kodu Java)
  • a metodą o najniższym priorytecie jest metoda staromodna — przy użyciu plików konfiguracyjnych XML.
Wiosna pozwala nam również łączyć te metody. Na przykład pozwól Springowi skonfigurować wszystko, co może być skonfigurowane automatycznie, użyj konfiguracji opartej na Javie wszędzie tam, gdzie potrzebujesz specjalnych parametrów, i użyj XML do wszelkich starszych konfiguracji. To wszystko działa dość elastycznie. Mimo to, jeśli wszystko można skonfigurować automatycznie, wybierz tę opcję. Rozważę tylko konfigurację automatyczną i konfigurację opartą na Javie. Konfiguracje XML są używane w prawie każdym przykładzie Springa w Internecie. Co więcej, kiedy zrozumiesz, jak działa konfiguracja oparta na Javie, nie powinieneś mieć problemu z odczytaniem pliku XML, który robi to samo. Konfiguracja automatyczna jest używana, gdy musimy pracować z obiektami klas, które napisaliśmy. Jeśli stworzenie jednego z naszych obiektów wymaga bardzo specyficznej logiki, lub jeśli nie jesteśmy w stanie utworzyć klasy z adnotacją niezbędną do automatycznej konfiguracji, możemy użyć konfiguracji opartej na Javie, aby zrobić to, co należy zrobić. ww następnej części stworzymy projekt Maven, połączymy kilka głównych modułów Springa i stworzymy nasze pierwsze fasole.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION