Як весна знає, який поліморфний тип використовувати.
Поки існує лише одна реалізація інтерфейсу і ця реалізація анотована при @Component
включеному скануванні компонента Spring, Spring Framework може з'ясувати пару (інтерфейс, реалізація). Якщо сканування компонентів не ввімкнено, вам доведеться чітко визначити бін у вашому застосунку-config.xml (або еквівалентному файлі конфігурації весни).
Чи потрібен мені @Qualifier або @Resource?
Після того, як у вас є кілька варіантів реалізації, вам потрібно кваліфікувати кожну з них і під час автоматичного проводки вам потрібно буде використовувати @Qualifier
анотацію, щоб ввести правильну реалізацію разом з @Autowired
анотацією. Якщо ви використовуєте @Resource (J2EE семантика), то вам слід вказати ім'я квасолі, використовуючи name
атрибут цієї анотації.
Чому ми автоматично підключаємо інтерфейс, а не реалізований клас?
По-перше, завжди корисно кодувати інтерфейси взагалі. По-друге, у випадку весни, ви можете ввести будь-яку реалізацію під час виконання. Типовим випадком використання є ін'єкція макету на етапі тестування.
interface IA
{
public void someFunction();
}
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
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();
}
Ваша конфігурація квасолі повинна виглядати так:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
Крім того, якщо ви включили сканування компонентів у пакеті, де він присутній, вам слід кваліфікувати кожен клас @Component
таким чином:
interface IA
{
public void someFunction();
}
@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Тоді worker
в MyRunner
буде введено екземпляр типу B
.