Wstrzykiwanie zależności - Spring

Wstrzykiwanie zależności - Spring
WA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:56
0

Jest taki przykład bez wstrzykiwania zależności:

Kopiuj
class Car {
    //Concrete class
    private WinterTire tire = new WinterTire(195);

    void drive() {
        tire.turn();
    }

}

Jest taki przykład realizujący wstrzykiwanie zależności:

Kopiuj
class Car {

    private Tire tire;

    Car(Tire tire) {
        this.tire = tire;
    }

    void drive() {
        tire.turn();
    }

}

Jak będzie wyglądał ten sam przykład, ale z wstrzykiwaniem zależności z użyciem springa i @Autowried?

S8
  • Rejestracja:ponad 6 lat
  • Ostatnio:7 miesięcy
  • Postów:63
0

Pewnie coś w tym stylu:

Kopiuj
@Component
class Car {
 
    private Tire tire;
 
    @Autowired
    Car(Tire tire) {
        this.tire = tire;
    }
 
    void drive() {
        tire.turn();
    }
 
}

Edit: Z tym że zupełnie nie pamiętam, czy konstruktor musi być publiczny, czy może być tak jak masz w przykładzie o zasięgu paczki.

edytowany 2x, ostatnio: Seti87
WA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:56
0

Jaki jest zatem tego sens? Niewielka różnica pod względem chociażby ilości kodu. Niewielkie zastosowanie czy podany przykład jest dość średni? Posiada ktoś może przykład, w którym widać będzie ewidentną korzyść z wstrzykiwania zależności w springu w stosunku do zwykłego?

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

@Warmix: generalnie jest to sprawa kontrowersyjna nieco, ale pod względem DI to Spring ma taką zalete ze jest łatwiej przy większym projekcie niż kilka czy kilkanaście klas. Aplikacje biznesowe mają przynajmniej kilkadziesiąt klas, a często dużo więcej i ławiej tak nimi zarządzac niż przez ręczne tworzenie modułów przez new. No i Spring umożliwia korzystanie z AOP.
Oczywiście nie twierdze że Springa nalezy zawsze używac bo Spring nie jest lekarstwem na wszysto :D


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
0

Zaletą jest to ze nie potrzebujesz trzeciej klasy która tworzy i łączy te obiekty. (Chociaż nie każdy uzna to za zaletę)


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

Jeden z talków na ten temat

titlehttps://pbs.twimg.com/media/DMkcnB0XkAA9QTo.jpg


jeden i pół terabajta powinno wystarczyć każdemu
Aventus
If you're seeing benefit from separation of concerns, your codebase is already out of control.
Aventus
Też sobie mogę takiego rodzaju argument stosować...
jarekr000000
Akurat Tomer zrobił cały występ dlaczego tak uważa. Co więcej zupełnie się z nim zgadzam.
Aventus
Wiem, ja tylko twierdzę że argument akurat słaby bo można go stosować wedle uznania. Szczególnie jeśli wyrwie się go z kontekstu, co paradoksalnie Ty zrobiłeś ;)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4
  1. Przykład jest bez sensu, bo nie wtrzykuje sie kontenerem obiektów w takim przypadku
  2. Jeśli w ogóle to składa się w ten sposób infrastrukturę aplikacji, więc repozytoria, serwisy, kontrolery itd. Nie obiekty domenowe. Jeśli ktoś tworzy kontenerem jakiś obiekt Car i Tire a potem to sobie wstrzykuje, to jest obłąkany :D
  3. Zaleta jest taka, że możesz sobie wygodnie wstrzyknąć choćby wszystkie implementacje jakiegoś interfejsu, nawet takie które dopiero ktoś dołożył do twojej aplikacji w postaci jakiegoś jara przed chwilą. Nie musisz też bawić się w takie rzeczy jak ręczne bawienie się w injectowanie properties, bo te też Spring sobie automagicznie znajdzie.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
M1
  • Rejestracja:około 6 lat
  • Ostatnio:około 5 lat
  • Postów:1
0

Cześć,

mój pierwszy post więc wpierw chciałbym przywitać Was wszystkich.

Jestem obecnie na etapie szukania nowego miejsca pracy i jest taka sytuacja że kolega mnie polecił do pewnej firmy i dał mi parę wskazówek co do rozmowy kwalifikacyjnej. No i tam wymienił parę tematów które trzeba umieć na blachę i w tym również Dependency Injection w Springu i trzeba zaznaczyć że wstrzykiwanie przez konstruktor to jedyne słuszne (albo minimum zalecane) podejście.

No i w tym miejscu przypomniało mi się że byłem kiedyś na szkoleniu zewnętrznym ze springa gdzie prowadzący wspomniał aby nigdy nie używać @Autowired na polach w kodzie produkcyjnym z wyjątkiem testów. Było to ze 2 lata temu, po 2 dniach szkolenia człowiek wrócił do rzeczywistości gdzie w projekcie @Autowired jest używane na potęgę na polach i w sumie ciekawa wiedza ze szkolenia wyparowała.

No ale teraz kiedy na nowo pojawił się ten temat to się zastanawiam jak wstrzykiwanie poprzez konstruktor współdziała ze Springiem. Dla mnie dotychczas Spring dawał tę wygodę że deklaruję pola odnosząc się do interfejsów, Spring mi ładnie wstrzykuje implementację i cyk fajnie, bez zapychania konstruktorów parametrami dla zależności, działa sobie automatycznie.

No ale teraz kiedy ja na rozmowach śpiewam o tym DI poprzez konstruktor to sam się zastanawiam czy oni na prawdę używają tego rodzaju wstrzykiwania w projekcie czy to może jest taka troche ściema i pytają o to aby wiedzieć że przynajmniej kandydat ma świadomość różnych sposobów DI w Springu (ze na polach, konstruktorach i setterach) i że przynajmniej w teorii to powinno się używać poprzez konstruktor.

Próbując sobie wyobrazić jak miałoby to wyglądać w większym projekcie to ciężko jest mi to ogarnąć, powiedzmy że mamy wiele klas, każda po kilka zależności, wszędzie wymóg przez konstruktor. I jak wtedy mamy dostarczyć tę instancję? Tworzyć za każdym razem nowa, poprzez jakąś Fabrykę? Zapewnić w ramach fabryki aby to była jedna instancja na sesje (od tego chyba jest Spring właśnie)?

Czy wy, zaczynając nowy projekt w Springu i mając za zadanie zdecydować, jaki rodzaj DI użyć to co bralibyście pod uwagę i dlaczego podjęlibyście taką a nie inną decyzję? Może stosować różne zależnie od problemu w danym fragmencie kodu?

Ogólnie mam wrażenie że jakbym trafił do tej firmy to by się okazało że używają @Autowired na polach i rozmowa rozmową ale rzeczywistość jest taka sama wszędzie, @Autowired się przyjęło na polach, działa, więc nie komplikujemy skoro spełniamy wymagania klienta.

@jarekr000000 film który podałeś oglądnę wieczorem, jeśli znajdę tam odp na moje pytania to super. Nie ukrywam że mimo tego chciałem trochę jeszcze rozruszać dyskusję i poznać wasze zdania na ten temat.

Patryk27
Załóż nowy wątek;
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Nie znoszę żadnego Autowireda. Ale nawet wśród najgorszych Springowców od dawna (na pewno ze dwa lata) nie muszę się kłócić o to, że nie używamy field injection. W starych systemach są powoli przepisywane na konstruktory, albo Spring jest całkiem wywalany (paradoksalnie wygląda to prawie zupełnie tak samo w kodzie).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)