Wpis z mikrobloga

#programowanie #spring #java

Szukam jakiegoś artykułu/dokumentacji odnośnie wczytywania beanów w Springu.

Niby prosta sprawa: robisz klasę, oznaczasz adnotacją @Service/@Component, używasz @Autowired i z głowy.

Ale czy wybór beana, który ma być wstrzyknięty jest na podstawie klasy (pełna nazwa pakietowa) czy po nazwie beana, co jak są konflikty (tak, wiem o @Primary, ale nie raz nie ma konfliktów a jest kilka podobnych), co jak są interfejsy, co z dziedziczeniem interfejsów, co z klasami, co z klasami, które implementują interfejsy, co z takimi samymi klasami/interfejsami w różnych pakietach, co jak nazwy beanów są ustawiane ręcznie, co z kolejnością wczytywania, czy pierwszeństwo ma nazwa czy klasa/interfejs, czy klasa czy interfejs, co z typem pola z beanem, czy znaczenie ma nazwa pola, co jak jest kilka kontekstów, co z różnymi scopami, co jak się nadpisują itd. itd.

W dokumentacji Springa nie mogę znaleźć dokładnego opisu tego jaka jest brana idea przy wczytywaniu/dopasowywaniu/tworzeniu beanów.

Mam w projekcie bardzo skomplikowaną bardzo podobnych beanów, w których jeden drugiego nadpisuje. Żeby to ogarnąć musiałbym porobić testy każdego przypadku, żeby zrozumieć jak działa Autowired w Springu. Albo czytać implementację. Może ktoś już to zrobił i spisał wnioski?
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mk321: Wszystko jest w dokumentacji spring core/aop. Bez różnicy czy wstrzykujesz po klasie która ma kilka impl. czy interfejsie. Jak jest kilka implementacji to możesz użyć @Qualifier Możesz np. wstrzyknąć odpowiednią implementację Możesz też w zależności od profilu stworzyć odpowiednią implementację i wstrzyknąć ja po typie bazowym @Profile
  • Odpowiedz
@mk321: intellij idea ultimate ma pokazane jak wyglądają beany. Spring boot actuator też ci wszystko pokaże. Ewentualnie możesz stworzyć sobie serwis który tam wywolasz jakoś, np poprzez kontroler i w debugu wywołać tam applicationContext. Tam masz wszystko rozpisane, beany, singletony, prototype, definicje beanow. Możesz metodę getBean(nazwaBeana.class) wywołać też żeby zobaczyć co wzięło.
  • Odpowiedz
@TheDudee: 1 wywali się bo 2 beany 2. wywali się bo również 2 beany 3. również, skoro masz kilka implementacji spring magicznie nie będzie wiedział które wybrać, więc tak, Qualifier 4. chyba wiadomo ( ͡° ͜ʖ ͡°)
  • Odpowiedz