Как работает аннотация Spring @Autowired в конструкторе?

Я изучаю среду Spring, и у меня есть следующие сомнения, связанные с аннотацией @Autowired в конструкторе этого примера:

@Component
public class TransferServiceImpl implements TransferService {

    @Autowired
    public TransferServiceImpl(AccountRepository repo) {
        this.accountRepository = repo;
    }
}

Так что именно имеется в виду? Что объект AccountRepository repo (определенный где-то как компонент) автоматически внедряется в конструктор TransferServiceImpl()?

Как работает эта операция? Это делается по типу? (поскольку AccountRepository — это singleton для Spring по умолчанию) или что?

Tnx


person AndreaNobili    schedule 15.11.2014    source источник


Ответы (2)


Spring будет искать bean-компонент AccountRepository в контейнере. Возможны несколько сценариев:

1- Нет бинов с типом AccountRepository. Будет выброшено исключение.

2- Есть один bean-компонент с типом AccountRepository. Компонент будет внедрен при создании TransferServiceImpl.

3- Существует более одного bean-компонента с типом AccountRepository:

  • Возврат к имени компонента. В этом случае Spring будет искать bean-компонент типа AccountRepository с именем repo. Если совпадение найдено, оно будет введено.
  • Откат имени не работает (несколько bean-компонентов с одинаковым типом и именем). Будет выброшено исключение.
person Khalid    schedule 15.11.2014

С помощью @Component вы сообщаете процессу сканирования, что этот класс является bean-компонентом, с помощью @autowire вы указываете постпроцессору выполнить поиск в репозитории Spring для bean-компонента типа AccountRepository. Если компонент найден, он будет использоваться с аннотированным конструктором. В зависимости от области действия будет использоваться новый экземпляр (prototype) или будет передан уже созданный экземпляр компонента (singleton). Если в любом случае есть два bean-компонента, соответствующие аргументу конструктора, будет выдано исключение.

person Hannes    schedule 15.11.2014