Spring Boot – Jaki jest cel Autowired Constructors?

Rozwijam się w Spring Boot od nieco ponad roku, ale jeszcze nie zrozumiałem korzyści z używania konstruktora Autowired i zastanawiałem się, czy ktoś mógłby wyjaśnij mi to i co byłoby uważane za najlepszą praktykę.

Powiedzmy, że mam fasolkę w następujący sposób

@Component public class MyBean { void doSomeStuff() { } } 

I mam usługa, która ma zależność od tego komponentu bean

@Service public class MyServiceImpl implements MyService { private MyBean myBean; } 

Dla mnie najprostszym sposobem na wprowadzenie zależności w tej klasie byłoby po prostu dodanie adnotacji do zmiennej @Autowired

@Service public class MyServiceImpl implements MyService { @Autowired private MyBean myBean; } 

Ale są inne miejsca online (a także inni programiści z mojego zespołu), którzy preferują takie podejście:

@Service public class MyServiceImpl implements MyService { private MyBean myBean; @Autowired public MyServiceImpl(MyBean myBean) { this.myBean = myBean; } } 

Dla mnie użycie takiego konstruktora jest po prostu zbędnym kodem. Automatyczne podłączanie fasoli jest znacznie prostsze i prostsze niż to, co wydaje mi się kodem standardowym.

Komentarze

  • To me, using a constructor like that is simply redundant code. Autowiring the bean is much simpler and straightforward than what appears to me to be boilerplate code. i czy nie martwisz się o magię wstrzykiwania ziarna do zmiennej instace, która jest prywatna i nie ma metody ustawiającej? Nie martwisz się ogromnym długiem technicznym, jaki generuje to u Ciebie, Twoich współpracowników? Czy nie obawiasz się zbytniego przekazywania magicznego paradygmatu ' Spring zamiast dobrych praktyk projektowania?
  • Czy nie obawiasz się, że pozwolisz innym tworzyć instancję? z MyServiceImpl bez odpowiedniego wstrzyknięcia zależności?
  • To ' to nie to, że ' nie " dotyczy ", to ' to, że nie byłem ' nie zdaję sobie sprawy z tego, jak tworzyło to ogromny dług techniczny. Gdybyś mógł podać przykład, dlaczego ' to taka zła praktyka, ' dziękuję.
  • " Czy nie martwisz się zbytnim przekazywaniem informacji o magicznym paradygmacie ' zamiast projektowania dobrych praktyk? " Czy są jakieś zasoby dotyczące dobrych praktyk projektowych związane z tą dyskusją, które możesz polecić? ' chciałbym je przeczytać.
  • Zobacz tutaj: stackoverflow.com/questions/34580033/ …

Odpowiedź

Używasz prawdziwy konstruktor z tych samych powodów, dla których używasz publicznych metod pobierających i ustawiających zamiast upubliczniać prywatne zmienne.

Niektóre przykłady z życia wzięte: telefony komórkowe nie są dozwolone w bezpiecznych, wrażliwych na informacje lokalizacjach fizycznych. Wszelka komunikacja z tą bezpieczną lokalizacją musi odbywać się za pośrednictwem bezpiecznie ustanowionego, kontrolowanego i zaszyfrowanego protokołu komunikacyjnego, a nie potajemnie przez niemonitorowany i niekontrolowany fałszywy kanał komunikacyjny.

Na koncercie nie pozwalasz ludziom przerzucać rzeczy przez płot komuś, kto jest już na stadionie. Wszystko, co wchodzi i wychodzi, musi przejść przez bramę.

Jeśli to wszystko w przykładowym kodzie, to wygląda na to, że niepotrzebnie rozwlekły schemat. Ale często robimy inne rzeczy w konstruktorze oprócz ustawiania zmienne prywatne, takie jak walidacja. W wielu językach programowania zmiana sposobu wykonywania tej czynności po fakcie jest zmianą binarną, więc podanie konstruktora z góry może być rozsądnym krokiem.

Wreszcie, klasa powinna być w stanie działać niezależnie od wstrzyknięcia zależności. Jeśli umieścisz adnotację na prywatnym składniku, ale nie uwzględnisz konstruktora , zasadniczo ściśle związałeś tę klasę z kontenerem DI, a klasa nie będzie działać bez niego.

Komentarze

  • " Na koncercie nie ' nie zezwalasz ludziom na rzucanie rzeczy przez płot komuś, kto ' jest już na stadionie m. Wszystko, co wchodzi lub wychodzi, musi przejść przez bramę. " Ale nie '. Nie rozumiem, w jaki sposób użycie konstruktora zwiększa bezpieczeństwo automatycznego okablowania? Gdyby nie było wymagań dotyczących konstruktora (takich jak walidacja), czy użycie konstruktora przyniosłoby jakąkolwiek korzyść?
  • Umożliwisz później dodanie walidacji bez naruszania zgodności binarnej.
  • Ponadto pamiętaj, że prywatni członkowie powinni naprawdę pozostać prywatni. To ' to właściwie cały sens posiadania prywatnych członków.
  • Chodzi o to, aby projektować dobre praktyki zgodne z @Autowire. Posiadanie konstruktorów jest NAJBARDZIEJ naturalną rzeczą w OOP. Wręcz przeciwnie, (to, co nazywasz prostym i prostszym) jest trochę przerażające. Usunięcie konstruktorów nie daje żadnych realnych korzyści, ' nie ma w tym żadnej prostoty. Konstruktory należą do najprostszych metod w OOP.Same w sobie mają zwykle bardzo małą złożoność, która warta jest implementacji magii Spring IoC
  • Ze względu na to, co ' jest warte, Java zwykle jest i tak bardzo rozwlekły język. Jeśli ' chcesz ujarzmić część tej gadatliwości, wyeliminowanie konstruktorów prawdopodobnie nie przyniesie większego uszczerbku.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *