Czytałem w niektórych postach o Spring MVC i Portletach, że iniekcja pola nie jest zalecana. Jak rozumiem, wstrzyknięcie pola ma miejsce, gdy wstrzykujesz Fasolę w @Autowired
następujący sposób:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
W trakcie moich badań czytałem również o iniekcji konstruktora :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Jakie są zalety i wady obu tych typów zastrzyków?
EDYCJA 1: Ponieważ to pytanie jest oznaczone jako duplikat tego pytania, sprawdziłem je. Ponieważ nie ma żadnych przykładów kodu ani w pytaniu, ani w odpowiedziach, nie jest dla mnie jasne, czy zgaduję, jakiego typu wtrysku używam.
Date(int,int,int)
istnieje.Odpowiedzi:
Rodzaje wtrysku
Istnieją trzy opcje wstrzykiwania zależności do fasoli:
Używasz opcji 3. To właśnie się dzieje, gdy używasz
@Autowired
bezpośrednio na swoim polu.Wytyczne dotyczące wtrysku
Ogólne wytyczne, które są zalecane przez Spring (zobacz sekcje dotyczące DI opartego na konstruktorze lub DI opartego na seterze ) są następujące:
Wady iniekcji w terenie
Powody, dla których iniekcja w terenie jest niezadowolona, są następujące:
Wniosek
W zależności od potrzeb należy przede wszystkim używać iniekcji konstruktora lub mieszanki iniekcji konstruktora i ustawiacza. Wstrzyknięcie w terenie ma wiele wad i należy go unikać. Jedyną zaletą wtrysku polowego jest to, że wygodniej jest pisać, co nie przeważa nad wszystkimi wadami.
Dalsza lektura
Napisałem artykuł na blogu o tym, dlaczego wstrzyknięcie pola zwykle nie jest zalecane: Wstrzyknięcie pola z zależnością uważane za szkodliwe .
źródło
Jest to jedna z niekończących się dyskusji na temat tworzenia oprogramowania, ale główni wpływowi w branży są coraz bardziej opiniowani na ten temat i zaczęli sugerować wstrzyknięcie konstruktora jako lepszą opcję.
Wstrzyknięcie konstruktora
Plusy:
Cons:
Zasadniczo iniekcja w terenie jest odwrotna.
źródło
Kwestia gustu. To Twoja decyzja.
Ale mogę wyjaśnić, dlaczego nigdy nie używam wtrysku konstruktora .
Nie chcę, aby zaimplementować konstruktor dla wszystkich moich
@Service
,@Repository
i@Controller
fasoli. To znaczy, jest około 40-50 ziaren lub więcej. Za każdym razem, gdybym dodawał nowe pole, musiałbym rozbudowywać konstruktora. Nie. Nie chcę tego i nie muszę.A jeśli twoja fasola (usługa lub kontroler) wymaga wstrzyknięcia dużej ilości innych ziaren? Konstruktor z parametrami 4+ jest bardzo brzydki.
Jeśli używam CDI, konstruktor mnie nie dotyczy.
EDYCJA nr 1 : Vojtech Ruzicka powiedział:
Tak. Teoria i rzeczywistość. Oto przykład:
DashboardController
mapowany do pojedynczej ścieżki*:8080/dashboard
.My
DashboardController
zbiera wiele informacji z innych usług, aby wyświetlić je na pulpicie nawigacyjnym / stronie przeglądu systemu. Potrzebuję tego pojedynczego kontrolera. Muszę więc zabezpieczyć tylko tę jedną ścieżkę (podstawowa autoryzacja lub filtr roli użytkownika).EDYCJA nr 2 : Ponieważ wszyscy koncentrują się na 8 parametrach w konstruktorze ... To był przykład z prawdziwego świata - stary kod klienta. Zmieniłem to. Ta sama argumentacja dotyczy mnie dla parametrów 4+.
Chodzi o wstrzyknięcie kodu, a nie o budowę instancji.
źródło
Jeszcze jedna uwaga - Vojtech Ruzicka stwierdził, że Wiosna wstrzykuje fasolę na trzy sposoby (odpowiedź z największą liczbą punktów):
Ta odpowiedź jest ZŁA - ponieważ DLA KAŻDEGO RODZAJU SPRĘŻYNY WTRYSKU WYKORZYSTUJE ODBLASK! Użyj środowiska IDE, ustaw punkt przerwania w programie ustawiającym / konstruktorze i sprawdź.
Może to być kwestia gustu, ale może to być również kwestia przypadku. @dieter zapewnił doskonały przypadek, gdy wtrysk w terenie jest lepszy. Jeśli używasz iniekcji pola w testach integracyjnych, które konfigurują kontekst Springa - argument z testowalnością klasy również jest niepoprawny - chyba że chcesz później pisać o testach do swoich testów integracyjnych;)
źródło