Spring. Внедрение через конструктор / Constructor injection

В данном примере попытаемся понять, как устанавливать значения свойств бина используя внедрение через конструктор.
Предположим, что имеется класс User.
Класс User имеет три атрибута - name, age, country. Все три атрибута устанавливаются через конструктор. Метод toString() переопределен для отображения объекта пользователя.
Конфигурационный файл beans.xml используется для настройки бинов в контейнере Spring IoC.
Следующий код демонстрирует как установить значение свойства используя внедрение через конструктор.
Элемент constructor-arg внутри элемента bean используется для установки значения свойства с использованием внедрения через конструктор. Поскольку у нас только один конструктор в классе User, код будет работать нормально. Но в случае, когда имеется более одного конструктора с одинаковым количеством аргументов, тогда возникнут двусмысленности.
Рассмотрим следующий код:
Конфигурационный файл:
Как Вы думаете, какой конструктор будет вызван? Первый попавшийся с первым аргументом int и вторым String, верно? Но, как ни странно, вызовется второй конструктор с обоими аргументами String, поскольку спринг интерпретирует аргументы как String по умолчанию. Для избежания таких неприятных ситуаций следует указывать атрибут type в элементе constructor-arg.
Имея следующую конфигурацию, спринг вызовет первый конструктор.
Рассмотрим еще один вариант. Допустим, у нас есть следующие конструкторы в классе User:
Теперь конфигурационный файл:
Теперь какой конструктор будет вызван, как думаете? Второй, верно? Но опять неправильно. Будет вызван первый конструктор, поскольку учитывается порядок аргументов в файле конфигурации. Для решения этой проблемы можно использовать атрибут index для задания порядка аргументов конструктора.
Вот пример конфигурации после добавления атрибута index.
Теперь, как и ожидалось, будет вызван второй конструктор.
Материалы, которые могут вас заинтересовать
- Spring. Теги на форме / Form Tags
- Spring. Внедрение через сеттер / Setter injection
- Spring: Контроллеры, основанные на аннотациях / Annotation Controller. Пример
- Spring SimpleFormController. Пример
- Пример Spring MVC
- Spring IoC. Пример
- Spring. Как это работает? Часть 3
- Spring. Как это работает? Часть 1
- Настройка Eclipse для работы со Spring IDE + Hello World Spring Application







Отличный блог, только сегодня нашёл, случайно, но теперь буду читать постоянно)
В общем, спасибо за проделанную работу.
PS извиняюсь, что не по теме.
Большое спасибо, что отписали. Очень приятно, что сайт нравится людям.
Хороший пример, потому что понятно, что для чего нужно и что от чего зависит!
только непонятно одно:
"Будет вызван первый конструктор, поскольку учитывается порядок аргументов в файле конфигурации. " Так ведь во втором же конструкторе порядок аргументов соответствует порядку их следования в конфигурационном файле - первый int, второй - string. Он и должен вызваться
Отправить комментарий