2013-05-22 22 views
6

Dlaczego Spring automatycznie wybiera typy nadklasy podczas autowiring?Nadwozowa sprężyna automatyczna

Na przykład, jeśli mam

@Component 
public class Foo {} 

@Component 
public class Bar extends Foo {} 

i ktoś autowires

@Autowired 
private Foo foo; 

Jak przyjdzie wiosna zawsze wybiera supertypem Foo? Czy nie powinno to być "niejednoznacznym" mapowaniem (i powodować, że Spring będzie wyświetlał błąd)?

Nie masz technicznych kandydatów na dwóch ? Bar pobiera automatycznie wybiera, gdy @Component jest usuwany z Foo ...)

Odpowiedz

9

Może to być spowodowane tym, że autowiring jest wykonywany według nazwy, a nie typu. Jeśli konfiguracja I mój fasola użyciu xml jak poniżej:

<bean id="foo1" class="Foo"/> 
<bean id="foo2" class="Bar"/> 

i próbować autowire według typu:

@Autowired private Foo aFoo; 

uzyskać

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [Foo] 
3

Autowiring może pracować z użyciem nazwy typu i nazwy komponentu, w zależności od konfiguracji.

W tym przypadku, ponieważ istnieją dwie fasole typu Foo, można wybrać instancję Foo, ponieważ jest ona zgodna z nazwą zmiennej foo.

Co stanie się, jeśli zmienisz nazwę na foo na coś innego?

3

jeśli istnieją dwa fasola tego samego typu, a następnie spring próbuje rozwiązać zależność pod nazwą zmiennej, którą określiłeś. Jeśli nazwa nie jest zgodna z żadną nazwą fasoli, zostanie zgłoszony błąd. Jeśli jednak znajdzie nazwę komponentu pasującego do podanej nazwy zmiennej, wstrzyknie ten komponent bean. Tak więc, podczas wstrzykiwania zależności, wiosna uwzględnia zarówno typ, jak i nazwę.