Контейнер Spring може автоматично встановлювати відносини між бінами, що взаємодіють. Ти можеш дати Spring автоматично виконати дозвіл взаємодіючих об'єктів (інших бінів) для твого біна, переглядаючи вміст ApplicationContext. Автоматичне виявлення та зв'язування має такі переваги:

  • Автоматичне виявлення та зв'язування дозволяє значно скоротити кількість інструкцій для зазначення властивостей або аргументів конструктора (інші механізми, такі як шаблон біна, що розглядається в інших частинах цього розділу, також корисні щодо цього)

  • Автоматичне виявлення та зв'язування дозволяє оновлювати конфігурацію в міру розвитку ваших об'єктів. Наприклад, якщо потрібно додати залежність до класу, ця залежність може бути задоволена автоматично, без необхідності змінювати конфігурацію. Таким чином, автоматичне виявлення та зв'язування може бути особливо корисним під час розробки, що не скасовує можливість переходу до явного зв'язування, коли кодова база стане стабільною.

При використанні конфігураційних метаданих на основі XML ти можеш установити режим автоматичного зв'язування у визначенні біна за допомогою атрибуту autowire елемента <bean/>. Функціональність автоматичного виявлення та зв'язування має чотири режими. Ти визначаєш автоматичне виявлення та зв'язування для кожного біна і, таким чином, можеш обирати, які з них автоматично зв'язувати. У наступній таблиці описано чотири режими автоматичного виявлення та зв'язування:

Таблиця 2. Режими автоматичного виявлення та зв'язування
Режим Пояснення

no

(За замовчуванням) Без автоматичного виявлення та зв'язування. Посилання на біни мають бути визначені елементами ref. Зміна параметра за замовчуванням не рекомендується для великих розгортань, оскільки явне зазначення об'єктів, що взаємодіють, забезпечує більший контроль і ясність. Певною мірою він документує структуру системи.

byName

Автоматичне виявлення та зв'язування за ім'ям властивості. Spring шукає бін з тим самим ім'ям, що й властивість, яка має бути автоматично виявлена та пов'язана. Наприклад, якщо у визначенні біна міститься інструкція на автоматичне виявлення та зв'язування за іменем та властивістю master (тобто має метод setMaster(..)), Spring шукає визначення біна з ім'ям master та використовує його для встановлення властивості.

byType

Дозволяє властивості бути автоматично виявленою і пов'язаною, якщо в контейнері існує рівно один бін із цим типом властивості. Якщо існує більше одного, то генерується критичний виняток, який вказує на те, що не можна використовувати режим автоматичного виявлення та зв'язування byType для цього бына. Якщо бінів немає, нічого не станеться (властивість не буде зазначено).

constructor

Аналогічно byType, але застосовується до аргументів конструктора. Якщо в контейнері немає рівно одного біна з типом аргументу конструктора, виникає критична помилка.

За допомогою режиму автоматичного виявлення та зв'язування byType або constructor можна пов'язувати масиви та типізовані колекції. У таких випадках усі компоненти-кандидати для автоматичного виявлення та зв'язування, що знаходяться в контейнері та відповідні очікуваному типу, надаються для задоволення залежності. Ти можеш здійснювати автоматичний пошук та зв'язування екземплярів Map зі строгою типізацією, якщо очікуваний тип ключа — String. Значення екземпляра Map, що автоматично зв'язується, складаються з усіх екземплярів бінів, відповідних очікуваному типу, а ключі екземпляра Map містять відповідні імена бінів.

Обмеження та недоліки автоматичного виявлення та зв'язування

Автоматичне виявлення та зв'язування працює найкраще, якщо його використовувати послідовно в межах всього проєкту. Якщо автоматичне виявлення та зв'язування взагалі не використовується, розробникам може бути складно використовувати його для зв'язування лише одного або двох визначень біна.

Розглянемо обмеження та недоліки автоматичного виявлення та зв'язування:

  • Явні залежності в property та constructor-arg завжди перевизначають автоматичне виявлення та зв'язування. Не можна автоматично пов'язувати прості властивості, такі як примітиви, Strings та Classes (і масиви таких простих властивостей). Це обмеження є навмисним.

  • Автоматичне виявлення та зв'язування є менш точним, ніж явне зв'язування. Хоча, як зазначалося в попередній таблиці, Spring намагається не вдаватися до передбачання у разі неоднозначності, що може призвести до несподіваних результатів. Взаємозв'язки між твоїми об'єктами, керованими Spring, більше не документуються явно.

  • Інформація про зв'язування може бути недоступною для інструментів, які здатні генерувати документацію з контейнера Spring.

  • Множинні визначення бінів у контейнері можуть відповідати типу, вказаному встановлюючим методом або аргументом конструктора для автоматичного виявлення та зв'язування. Для масивів, колекцій або екземплярів Map це не обов'язково проблема. Однак щодо залежностей, для яких очікується якесь єдине значення, ця двозначність не дозволяється довільно. Якщо унікальне визначення біна недоступне, генерується виняток.

В останньому випадку у тебе є кілька варіантів:

  • Відмовся від автоматичного виявлення та зв'язування на користь явного зв'язування.

  • Уникай автоматичного виявлення та зв'язування для визначення біна, встановивши його атрибути autowire-candidate у false

  • Признач одне визначення біна як основного компонента-кандидата, встановивши атрибут primary елемента <bean/> як true.

  • Реалізуй більш тонкий контроль, доступний під час конфігурації на основі анотацій.

Виключення біна з методу автоматичного виявлення та зв'язування

Відносно кожного біна можна виключити його з методу автоматичного виявлення та зв'язування. У XML-форматі Spring вкажи атрибут autowire-candidate елемента <bean/> як false. Контейнер зробить це конкретне визначення біна недоступним для інфраструктури автоматичного виявлення та зв'язування (включно з конфігураціями в стилі анотації, такими як @Autowired).

Атрибут autowire-candidate призначений лише для впливу на метод автоматичного виявлення та зв'язування на основі типу. Він не впливає на явні посилання на ім'я, які дозволяються, навіть якщо зазначений бін не позначено як компонент-кандидат для автоматичного виявлення та зв'язування. Як наслідок, автоматичне виявлення та зв'язування на ім'я, тим не менше, впроваджує бін, якщо ім'я збігається.

Ти також можеш обмежити компоненти-кандидати на автоматичне виявлення та зв'язування на основі зіставлення шаблонів з іменами бінів. Елемент верхнього рівня <bean/> приймає один або кілька шаблонів у своєму атрибуті default-autowire-candidates. Наприклад, щоб обмежити статус компонента-кандидата на автоматичне виявлення та зв'язування будь-яким біном, ім'я якого закінчується на Repository, підстав значення *Repository. Щоб передати кілька шаблонів, вкажи їх у списку, в якому відділи їх комами. Явне значення true або false для атрибуту autowire-candidate у визначенні біна завжди пріоритетніше. Для таких бінів правила відповідності шаблону не застосовуються.

Ці методи корисні у разі використання бінів, які вам ніколи не потрібно впроваджувати в інші біни за допомогою автоматичного виявлення та зв'язування. Це не означає, що виключений бін не може бути сам налаштований за допомогою автоматичного виявлення та зв'язування. Швидше, сам бін не є компонентом-кандидатом на автоматичне виявлення та зв'язування інших бінів.