1. Обзор
В этом руководстве мы увидим, как мы можем ввести значение из файла свойств Java в статическое поле с помощью Spring.
2. Проблема
Для начала представим, что мы установили свойство в файл свойств:
name = Inject a value to a static field
После этого мы хотим внедрить его значение в переменную экземпляра.
Обычно это можно сделать, используя аннотацию @Value в поле экземпляра:
@Value("${name}")
private String name;
Однако, когда мы попытаемся применить его к статическому полю, мы обнаружим, что оно по-прежнему будет нулевым
:
@Value("${name}")
private static String NAME_NULL;
Это потому, что Spring не поддерживает @Value
для статических полей .
Теперь, по правде говоря, это странное положение для нашего кода, и мы должны сначала подумать о рефакторинге. Но давайте посмотрим, как мы можем заставить это работать.
3. Решение
Во-первых, давайте объявим статическую переменную, которую мы хотим внедрить , NAME_STATIC
.
После этого мы создадим метод установки с именем setNameStatic
и аннотируем его аннотацией @Value
:
@RestController
public class PropertyController {
@Value("${name}")
private String name;
private static String NAME_STATIC;
@Value("${name}")
public void setNameStatic(String name){
PropertyController.NAME_STATIC = name;
}
}
Давайте попробуем разобраться в том, что происходит выше.
Во- первых, PropertyController
, который является RestController
, инициализируется Spring.
После этого Spring ищет аннотированные поля и методы Value .
Spring использует внедрение зависимостей для заполнения определенного значения, когда находит аннотацию @Value
. Однако вместо передачи значения переменной экземпляра оно передается неявному установщику. Затем этот установщик обрабатывает заполнение нашего значения NAME_STATIC
.
4. Вывод
В этом кратком руководстве мы рассмотрели, как внедрить значение из файла свойств в статическую переменную. Это путь, который мы можем рассмотреть, когда наши попытки рефакторинга потерпят неудачу.
Как всегда, код доступен на GitHub .