Перейти к основному содержимому

Введение значения в статическое поле в Spring

· 2 мин. чтения

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 .