«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.