Przykład
interface IA
{
public void someFunction();
}
@Resource(name="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Resource(name="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
worker.someFunction();
}
Czy ktoś może mi to wyjaśnić.
- Skąd wiosna wie, jakiego typu polimorficznego użyć.
- Czy potrzebuję
@Qualifier
czy@Resource
? - Dlaczego autowireujemy interfejs, a nie zaimplementowaną klasę?
java
spring
dependency-injection
przepełnienie stosu
źródło
źródło
Odpowiedzi:
Dopóki istnieje tylko jedna implementacja interfejsu i ta implementacja jest opatrzona adnotacją z
@Component
włączonym skanowaniem komponentów Springa, Spring Framework może znaleźć parę (interfejs, implementacja). Jeśli skanowanie komponentów nie jest włączone, musisz jawnie zdefiniować komponent bean w pliku application-config.xml (lub w równoważnym pliku konfiguracyjnym sprężyny).Gdy masz więcej niż jedną implementację, musisz zakwalifikować każdą z nich, a podczas automatycznego okablowania musisz użyć
@Qualifier
adnotacji, aby wstrzyknąć właściwą implementację wraz z@Autowired
adnotacją. Jeśli używasz @Resource (semantyka J2EE), powinieneś określić nazwę ziarna, używającname
atrybutu tej adnotacji.Po pierwsze, ogólnie rzecz biorąc, dobrą praktyką jest kodowanie interfejsów. Po drugie, w przypadku wiosny możesz wstrzyknąć dowolną implementację w czasie wykonywania. Typowym przypadkiem użycia jest wstrzyknięcie fałszywej implementacji na etapie testowania.
Twoja konfiguracja fasoli powinna wyglądać następująco:
Alternatywnie, jeśli włączyłeś skanowanie komponentów w pakiecie, w którym są one obecne, powinieneś zakwalifikować każdą klasę
@Component
w następujący sposób:Następnie
worker
wMyRunner
będą wstrzyknięto przykład typuB
.źródło
@Autowired @Qualifier("a1") a;
ważne?@Autowired @Qualifier("a1") A a;
Może również powodować pewne ostrzeżenia w dziennikach, takie jak metoda Cglib2AopProxy Unable to proxy . I wiele innych powodów tego jest opisanych tutaj. Dlaczego zawsze mają pojedyncze interfejsy implementacji w warstwach usług i dao?
źródło