Перший application.yml профіль конфігурації виглядає так:
Проєкт Maven pom.xml додавання пакетів:
Створіть новий відображений об'єкт із наступним кодом:
Тип рядка повинен мати встановлювача для отримання значень властивості; карти, колекції та масиви не потрібні
Використовуйте @Autowired анотації для автоматичної ін'єкції, як показано на наступному зображенні:
esConfig завжди видає null, довго шукав рішення, але не вдалося, нижче буде рішення.
Створимо новий контролер, код виглядає так:
Ін'єкція проходить успішно, і значення файлу конфігурації yml отримуються нормально, наступним чином:
Причини, через які EsClient не може бути успішно впроваджений, такі:
Викликаємо функцію цього класу в конструкторі, і змінна @Autowired цього класу використовується в цій функції.
Тож я подумав, що щось може піти не так. Тому що @Autowired потрібно чекати, поки клас буде побудований, перш ніж його можна буде встановити з зовнішніх посилань. Тому час введення @Autowired має бути пізніше за час виконання конструктора. Рішення:
Spring Team рекомендує: «Завжди використовуйте конструкторську ін'єкцію залежностей у зернах. Завжди використовуйте твердження для обов'язкових залежностей».
Переклад:
Весна радить: «Завжди встановлюйте ін'єкцію залежності з конструкторами у вашому зеренні. завжди використовуйте твердження для примусу до залежностей».
Оригінальний текст:
Змінений текст:
PS: Порядок ініціалізації змінних Java такий: статичні змінні або статичні блоки операторів — > змінні екземпляра або блоки ініціалізації операторів — >метод побудови — >@Autowired
То навіщо додавати фінальний тип до змінної члена?
В Інтернеті є таке пояснення: Область дії стандартного зерна у конфігурації пружини — singleton, яка завжди залишається після запуску. Оголосіть об'єкт зерна динамічно створеним, встановивши властивість scope як прототип. Однак, якщо ваш сервіс є одиночним, ін'єкція виконується лише один раз.
@Autowired сам режим є одиночним режимом, він виконується лише один раз при запуску програми, і не ініціалізується вдруге, навіть якщо не визначає фінал, тому цей фінал не має сенсу.
Це може бути зроблено для запобігання повторному виконанню конструктора під час роботи програми;
Або, можливо, це легше зрозуміти, плюс фінальний тест ініціалізується лише один раз, коли програма починається.
|