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

max аватар
93
Находится в разделах:

В данном примере попытаемся понять, как устанавливать значения свойств бина используя внедрение через конструктор.

Предположим, что имеется класс User.

Класс User имеет три атрибута - name, age, country. Все три атрибута устанавливаются через конструктор. Метод toString() переопределен для отображения объекта пользователя.

Конфигурационный файл beans.xml используется для настройки бинов в контейнере Spring IoC

Следующий код демонстрирует как установить значение свойства используя внедрение через конструктор. 

Элемент constructor-arg внутри элемента bean используется для установки значения свойства с использованием внедрения через конструктор.  Поскольку у нас только один конструктор в классе User, код будет работать нормально. Но в случае, когда имеется более одного конструктора с одинаковым количеством аргументов, тогда возникнут двусмысленности. 

Рассмотрим следующий код:

Конфигурационный файл:

Как Вы думаете, какой конструктор будет вызван? Первый попавшийся с первым аргументом int и вторым String, верно? Но, как ни странно, вызовется второй конструктор с обоими аргументами String, поскольку спринг интерпретирует аргументы как String по умолчанию. Для избежания таких неприятных ситуаций следует указывать атрибут type в элементе constructor-arg

Имея следующую конфигурацию, спринг вызовет первый конструктор.

Рассмотрим еще один вариант. Допустим, у нас есть следующие конструкторы в классе User:

Теперь конфигурационный файл:

Теперь какой конструктор будет вызван, как думаете? Второй, верно? Но опять неправильно. Будет вызван первый конструктор, поскольку учитывается порядок аргументов в файле конфигурации. Для решения этой проблемы можно использовать атрибут index для задания порядка аргументов конструктора. 

Вот пример конфигурации после добавления атрибута index.

Теперь, как и ожидалось, будет вызван второй конструктор. 


Конец
Альберт Эйнштейн предполагает, что тот, кто хочет видеть результаты своего труда немедленно, должен идти в сапожники.

Отличный блог, только сегодня нашёл, случайно, но теперь буду читать постоянно)

 

В общем, спасибо за проделанную работу.

 

PS извиняюсь, что не по теме.

max аватар

Большое спасибо, что отписали. Очень приятно, что сайт нравится людям. 

Хороший пример, потому что понятно, что для чего нужно и что от чего зависит!

только непонятно одно:

"Будет вызван первый конструктор, поскольку учитывается порядок аргументов в файле конфигурации. "  Так ведь во втором же конструкторе порядок аргументов соответствует порядку их следования в конфигурационном файле - первый int, второй - string.  Он и должен вызваться

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке