Первый application.yml конфигурационный профиль выглядит следующим образом:
Проект Maven pom.xml добавление пакетов:
Создайте новый отображённый объект с помощью следующего кода:
Тип строки должен нуждаться в установке для получения значений свойств; карты, коллекции и массивы не требуются
Используйте @Autowired аннотации для автоматической инъекции, как показано на следующем изображении:
esConfig всегда выводит null, долго искал решение, но не смог — решение будет ниже.
Давайте создадим новый контроллер, код выглядит следующим образом:
Инъекция проходит успешно, и значения конфигурационного файла yml получаются нормально, следующим образом:
Причины, по которым EsClient не может быть успешно внедрен, следующие:
Вызовем функцию этого класса в конструкторе, и переменная @Autowired этого класса используется в этой функции.
Так что я подумал, что что-то может пойти не так. Потому что @Autowired нужно ждать, пока класс будет построен, прежде чем его можно будет задать из внешних ссылок. Поэтому время ввода @Autowired должно быть позже времени выполнения конструктора. Решение:
Spring Team рекомендует: «Всегда используйте инъекции зависимостей на основе конструкторов в зёрна. Всегда используйте утверждения для обязательных зависимостей».
Перевод:
Спринг советует: «Всегда устанавливайте инъекции зависимости с помощью конструкторов в вашем зерне. всегда используйте утверждения для принудительного создания зависимости».
Оригинальный текст:
Изменённый текст:
PS: Порядок инициализации переменных Java следующий: статические переменные или статические блоки операторов — > экземплярные переменные или инициализационные блоки операторов — >метод построения — >@Autowired
Так зачем же добавлять финальный тип к переменной элемента?
В интернете есть следующее объяснение: область действия стандартного bean в конфигурации пружины — singleton, который всегда присутствует после запуска. Объявите объект bean как динамически созданный, установив свойство scope как прототип. Однако, если ваш сервис одиночный, инъекция выполняется только один раз.
@Autowired сам режим является одиночным режимом, он выполняется только один раз при запуске программы, и не инициализируется второй раз, даже если не определяет финал, поэтому этот финал не имеет значения.
Это может быть сделано для предотвращения повторного выполнения конструктора во время работы программы;
Или, может быть, это проще понять, плюс финальная программа инициализируется только один раз при старте программы.
|