Kurs Spring Boot #02 - Kontekst, Inversion of Control (IoC), Wstrzykiwanie zależności

Поділитися
Вставка
  • Опубліковано 2 лис 2024

КОМЕНТАРІ • 47

  • @matdabski
    @matdabski  4 роки тому +5

    Jeśli podobają Ci się moje filmy, to zostaw łapkę w górę i za subskrybuj mój kanał. Zapraszam Cię także do zapoznania się z moimi kursami i warsztatami:
    🟢 Kurs Hibernate i JPA - kursy.nullpointerexception.pl/hibernate/
    🟠 Warsztat Architektura Heksagonalna - kursy.nullpointerexception.pl/product/warsztat-architektura-heksagonalna/
    🟢 Kurs Testy Jednostkowe - kursy.nullpointerexception.pl/testy-jednostkowe/
    🟠 Warsztat Architektura Warstwowa - kursy.nullpointerexception.pl/product/warsztat-architektura-warstwowa/

  • @marcinwojcik85
    @marcinwojcik85 4 роки тому +1

    Mateusz potrafisz bardzo dobrze tłumaczyć i robisz świetną robotę. Pozdrawiam.

  • @devdwr9208
    @devdwr9208 4 роки тому +3

    Super! Dzięki wielkie za tak dobrze wytłumaczenie tych zagadnień :D

    • @matdabski
      @matdabski  4 роки тому

      Dzięki. Cieszę, że Ci się podobało.

  • @infinitezymalny
    @infinitezymalny 4 роки тому +3

    Trafiłem na kanał dzisiaj, jest super. Moja propozycja to Reactive Spring application.

    • @matdabski
      @matdabski  4 роки тому

      Cześć Maciej, dzięki za propozycję, na pewno rozważę taki temat ;)

  • @Jakub-ru8ej
    @Jakub-ru8ej 3 роки тому

    Bardzo konkretnie to prowadzisz, dzieki!

  • @Kamil92Zgon
    @Kamil92Zgon 4 роки тому +1

    Świetny, intensywny materiał ;)

  • @szymonolejnik9540
    @szymonolejnik9540 4 роки тому +2

    Fajny materiał :)
    Co do wstrzykiwania przez konstruktor to warto byłoby też wspomnieć w skrócie (lub też odesłać do innej lektury) czemu lepiej używać wstrzykiwania przez konstruktor niż jego alternatyw. Czekam na kolejne odcinki. Pozdrawiam :)

    • @matdabski
      @matdabski  4 роки тому +4

      Cześć Szymon, dzięki za uwagi. Pozwolę sobie wkleić fragment z dokumentacji springa:
      "The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null. Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns."
      Całość można znaleźć tutaj:
      docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-collaborators

  • @Pol31pl
    @Pol31pl 4 роки тому +2

    Super materiał :) Moja propozycja na kolejne filmy to: Spring Security z bazą danych

    • @matdabski
      @matdabski  4 роки тому

      Dzięki za propozycję będzie na pewno 😉

    • @matdabski
      @matdabski  4 роки тому +3

      @Błażej Witczak Jasne 😉 będzie z JWT. A być może zrobię dodatkowy odcinek z OAuth2, nie wiem tylko, czy wystarczy mi na to czasu 😉

  • @rsjavasolutions5543
    @rsjavasolutions5543 4 роки тому

    Super, tak trzymaj. Konkretnie przekazana wiedza. Zrób kiedyś SpringSecurity i zabezpieczanie wybranych endpointów apiKey.

  • @xcodeassociated
    @xcodeassociated 4 роки тому +3

    Super materiał!
    Sugestia: Może by pociągnąć temat kontekstów i omówić warstwę persystencji w Spring Data JPA...

    • @matdabski
      @matdabski  4 роки тому +1

      Dzięki za komentarz 😉 Będzie o Spring Data JPA w kolejnych częściach. Już nawet w następnej części będę o tym mówił przy okazji tworzenia rest api.

    • @dawiddawidowy1093
      @dawiddawidowy1093 4 роки тому +1

      Dokładnie, chętnie się dowiem dlaczego dla repo pisze się interface i jak to łączy się z db :)

    • @matdabski
      @matdabski  4 роки тому

      @@dawiddawidowy1093 dzięki za komentarz. Postaram się to tym opowiedzieć w czwartej części ;)

  • @joachimtworko4466
    @joachimtworko4466 4 роки тому +1

    Zawsze się zastanawiałem kiedy tak faktycznie jest potrzeba używania innego scope niż singleton, jakie to ma przełożenie w realnym projekcie? Dobry materiał.

    • @matdabski
      @matdabski  4 роки тому +1

      Trudno podać trafny przykład, dlatego go nie podałem ;) Generalnie można podejść do tego w taki sposób: jak chcesz przechować jakiś stan w beanie, a nie chcesz go współdzielić, to możesz użyć scope prototype. Jeśli robisz to w aplikacji webowej, to możesz skorzystać ze scope request (wtedy masz pewność, że inny użytkownik nie będzie miał dostępu do tego stanu). Ale oczywiście można to osiągnąć w dużo prostszy sposób, nie korzystając z beanów springowych. Po prostu tworzysz jakiś obiekt i zapisujesz w nim stan ;) i przekazujesz go jako parametr w metodach, w których go potrzebujesz.

  • @vladeb1104
    @vladeb1104 2 роки тому

    To może krótki odcinek: 'tutaj mamy apke bez używania beana, a tutaj to samo już z użyciem dependency'. Tak by wykazać dokładnie jakie bonusy daje injection dependency. Po za tym świetny odcinek, powtażam się ale te podejście 'wyjaśnie wszystko co jest underneath the hood' bardzo mi pasuje.

    • @matdabski
      @matdabski  2 роки тому +1

      To zamiast wstrzykiwania, używaj wszędzie np. new PostSerwis().
      I np. w klasie konfiguracyjnej możesz stworzyć beana
      @Bean
      public PostController postController() {
      return new PostController(new PostService(new PostRepository));
      }
      Chociaż post repository jest interfejsem, wiec tak to nie zadziała.
      Ale wyglądałoby to mniej więcej tak.

  • @makikaze
    @makikaze 4 роки тому +1

    Jedna uwaga. Nie jest prawdą, że trzeba zawsze ustawiać proxyMode przy wstrzykiwaniu beanów ze scopami request, session, prototype. Gdyby tak było nie byłoby to opcją. Jest to wymagane jedynie gdy wstrzykujemy beana o węższym scope do beana o szerszym scope. Przykładowo wstrzykiwanie request do session. Przy wstrzykiwaniu np. request do request lub session do request nie jest to wymagane. Samo proxyMode powoduje utworzenie klasy proxy by zapewnić istnienie zależności w momencie tworzeniu beana o szerszym scope, gdy sam bean zależności nie może zostać stworzony, bo nie istnieje wtedy sesja albo nie został wywołany request. Ten sam problem wystąpi gdy mimo użycia proxy chcemy użyć wstrzykniętej zależności gdy jej scope nie istnieje, np. zależności o scope session gdy nie ma jeszcze utworzonej sesji, wtedy spring rzuci wyjątkiem.

    • @matdabski
      @matdabski  4 роки тому

      Dzięki za komentarz. Jest tak, jak napisałeś. Użyłem tutaj skrótu myślowego. Jeśli wstrzykniesz bean session, czy request do beana typu singleton, który jest domyślnym typem beana w springu, to będziesz musiał ustawić proxyMode (dokładnie o to mi chodziło).

  • @certe6799
    @certe6799 4 роки тому +1

    To co więcej mi przyszło na myśl:
    wiecej o lombooku kiedy ok kiedy nie
    hascode z equals w kontekscie lombooka
    controller vs rest controller
    interface serwisu
    rozbudowane api
    własne zapytania w repo
    DAO, DTO, repo kiedy co
    na pewno wiecej o hibernate

    • @matdabski
      @matdabski  4 роки тому

      Dzięki za komentarz ;) Część rzeczy będzie pojawiać się w kolejnych częściach. Co do Lomboka to może nagram osobny odcinek poświęcony tylko Lombokowi. Jeśli chodzi o Hibernate, to też będzie więcej w kolejnych częściach, ale tak naprawdę to można o nim nagrać osobny kurs ;) Nie wiem, w jakim stopniu w tym kursie będzie pokryty temat Hibernate'a

  • @grzegorzsobczyk7671
    @grzegorzsobczyk7671 4 роки тому

    Cześć mam pytanko, bo chciałbym równocześnie rozwijać swoje restowe-api - najpierw oglądam Twój filmik -> przenoszę wiedzę do swojego projektu.
    Chciałbym żeby to moje api wystawiało endpointy na zamówienia z produktami w środku, lecz mam zagwozdkę jak to zamapować, jakich encji bym potrzebował. product,order na pewno, ale czy to wystarczy? Z góry dzięki za odpowiedź.

    • @matdabski
      @matdabski  4 роки тому +1

      Cześć Grzegorz. To zależy, jak dobrze chcesz to zrobić. Na początek wystarczy Product, Order, OrderItem, ProductCart, Customer, BillingAddress, ShipingAddress. Nie wiem co tam jeszcze. To chyba te podstawowe ;)

  • @lukaszgo3
    @lukaszgo3 3 роки тому

    Co w przypadku gdy mamy kilka konstruktorów?
    Czy w takim przypadku nie powinniśmy oznaczyć adnotacją jednego z nich?

    • @matdabski
      @matdabski  3 роки тому

      W beanach springowych nie używa się raczej kilku konstruktorów. To framework tworzy dla ciebie obiekt (w domyślnej konfiguracji tylko jedne), więc nie potrzebujesz kilku konstruktorów. A jak z jakichś względów chcesz stworzyć sobie dodatkowy konstruktor to pewnie, któryś musisz oznaczyć adnotacją. Nie wiem jak to będzie działać, bo nigdy nie potrzebowałem takiego rozwiązania😉

  • @terapiaMulinowa
    @terapiaMulinowa 3 роки тому

    Seria zapowiada się bardzo dobrze, bardzo jasno tłumaczysz :)
    Jestem początkująca, trochę koduję (piszę testy automatyczne) i chciałabym stworzyć prostą apkę webową z bazą danych do zarządzania motkami nici i wzorami do haftu (relacja wiele do wielu, plus wszelkie CRUDy).
    Pomyślałam, że mogłabym stworzyć sobie projekt na githubie, bo wtedy (jeżeli coś z tego wyjdzie :D ), to miałabym też co do pokazania rekruterom :D
    Mam pytanie, czy jest zrabialne takie coś, żeby zrobić adapter baz danych?
    Tzn. żeby rekruter mógł sobie odpalić apkę z użyciem H2 i testowymi danymi, a z kolei ja mogłabym lokalnie sobie używać MySql z realnymi danymi?
    Z góry dziękuję za porady :)
    Pozdrawiam

    • @matdabski
      @matdabski  3 роки тому +1

      Cześć, ciekawy pomysł na aplikację ;) Co do pytania, to teoretycznie jest taka możliwość. Wystarczy, że będziesz uruchamiać projekt z różną konfiguracją, i wczytywać konfigurację w zależności od potrzeb. Można to zrobić używają profili springa:
      docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-profiles.html
      i wtedy możesz mieć kilka plików konfiguracyjnych np. application-dev.properties, application-prod.properties
      docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties
      Do tego musisz unikać w aplikacji używania sql, jak będziesz używała JPA to częściowo powinno załatwić sprawę. W części 9 pokazuję jak korzystać z Liquibase to narzędzie do setupowania bazy. Jak w liquibase będziesz używała xml do konfiguracji bazy to całkowicie wyeliminujesz SQL, i będziesz mogła pracować na dwóch bazach na przemiennie, zmieniając tylko aktywny profil w springu.
      To sporo nauki i wiele problemów po drodze do rozwiązania. Może być Ci ciężko ogarnąć te wszystkie tematy, więc na początek proponuję napisać działającą aplikację, a dopiero później przerobienie jej w taki sposób, żeby działała na różnych bazach (jak się nie uda przerabianie, to przynajmniej będziesz miała aplikację do pokazania).
      Zapraszam także na grupę na FB, gdzie znajdziesz ewentualną pomoc facebook.com/groups/JavaSpringHibernate
      Powodzenia

    • @terapiaMulinowa
      @terapiaMulinowa 3 роки тому

      @@matdabski dziękuję za podpowiedzi :) do grupy się już zapisałam. Chyba zacznę od obejrzenia całej serii i zrobię sobie ćwiczenia, a potem zdecyduję od której bazy zacznę. Profile kojarzę, bo w testach tak ustawiamy środowiska, więc może bym ogarnęła. Myślałam też o jakiejś vm-ce, która włączyłaby tryb demo. Ale w sumie profile mi to ładnie załatwią :) jeszcze raz dziękuję i pozdrawiam

    • @maiky2189
      @maiky2189 Рік тому

      @@terapiaMulinowa I jak kariera programisty po dwóch latach? : D

    • @terapiaMulinowa
      @terapiaMulinowa Рік тому

      @@maiky2189 tak serio, to nie chodziło tak do końca o przejście na developerke, raczej łatwiejszą zmianę pracy, co się w sumie stało :D w obecnej firmie jestem uważana za guru w sprawach javy, choć nie wiem czemu :D wśród testerów to nie takie trudne :D A co do projektu, to porzuciłam po zmianie pracy, ale pamiętam że miałam jakiś problem z wczytywaniem obrazków do db :D No i kolega mi podpowiedział, że można zapisywać stan bazy H2, więc nie kombinowałam z przepinaniem

  • @TheStrus100
    @TheStrus100 4 роки тому

    Mnie ciekawi dlaczego używasz gardle. To poprostu przyzwyczajenie czy uważasz, że jest lepszy od mavena?

    • @matdabski
      @matdabski  4 роки тому

      Pisałem kiedyś o tym na blogu. Generalnie Gradle jest nowocześniejszy, dużo bardziej rozwijany, ma więcej pluginów, łatwiej napisać do niego plugina, łatwo dopisać kawałek skryptu, który zrobi coś specyficznego i to chyba mniej więcej to. A tutaj link do artykułu nullpointerexception.pl/dalczego-wole-gradle-od-mavena/

  • @marcinromaniak1549
    @marcinromaniak1549 4 роки тому +1

    Przy próbie dodania adnotacji @RequiredArgsConstructor otrzymuję błąd "2020-10-16 10:02:40.261 ERROR 20272 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
    java.lang.NullPointerException: null
    at pl.mr.controller.HelloController.hello(HelloController.java:25) ~[classes/:na]" , plugin lomboka jest zainstalowany oraz annotation procesor również jest włączone, linijka 25 która wyskakuje w powyższym błędzie to wynik metody :
    @GetMapping("/")
    public String hello(){
    return helloService.hello();
    }

    • @matdabski
      @matdabski  4 роки тому

      Cześć, czy klasa HelloService jest oznaczona adnotacją @Service? Czy próbowałeś zrobić konstruktor ręcznie bez użycia Lomboka?

    • @marcinromaniak1549
      @marcinromaniak1549 4 роки тому +1

      @@matdabski Tak zgadza się klasa HelloService oznaczona jest adnotacją @Service, przy ręcznym utworzeniu konstruktora, wszystko działa poprawnie. Dziękuję za szybką odpowiedź :)

    • @marcinromaniak1549
      @marcinromaniak1549 4 роки тому +1

      @@matdabski udało się rozwiązać problem utworzone pole HelloService nie zostało u mnie oznaczone jako finalne :)

    • @matdabski
      @matdabski  4 роки тому

      @@marcinromaniak1549 Spróbuj przebudować projekt Build > Rebuild Project lub z gradla clean build (w zależności od tego jak budujesz/uruchamiasz), restart IDE też może pomóc. Zwykle z Lombokiem nie ma problemów, ale to annotation procesor w dodatku potrzebuje plugina w IDE, więc jest kilka rzeczy, które mogą się popsuć.

    • @matdabski
      @matdabski  4 роки тому

      ok, super ;)