Pascal4eg / Java

 Java | Фишки и трюки

@Value Spring annotation

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Arrays;

@Service
public class MyService {
    @Value("string value")
    private String stringValue;
    @Value("${value.from.file}")
    private String valueFromFile;
    @Value("${systemValue}")
    private String systemValue;
    @Value("${unknown. param: some default}")
    private String someDefault;
    @Value("${priority}")
    private String prioritySystemProperty;
    @Value("${listOfValues}")
    private String[] valuesArray;

    @PostConstruct
    private void postConstruct() {
        System.out.println(stringValue); // string value
        System.out.println(valueFromFile); // Value got from the file
        System.out.println(systemValue); // systemValue
        System.out.println(someDefault); //some default
        System.out.println(prioritySystemProperty); // high
        Arrays.stream(valuesArray).forEach(System.out::println); // A B C
    }
}

Эту аннотацию можно использовать для ввода значений в поля в bean-компонентах, управляемых Spring, и ее можно применять на уровне поля или параметра конструктора/метода.

Заполним наш application.properties файл:

value.from.file=Value got from the file
priority=high
listOfValues=A,B,C

Первый и самый бесполезный вариант использования это указать просто строку в аннотации @Value, эта строка и установится как значение аннотируемого члена класса.

Используя конструкцию ${propname} в аннотации, можно получить значение из конфигурационного файла приложения или переменной окружения.

Если значения может не быть, то можно определить значение по умолчанию ${unknown.param:some default}, если этого не сделать, то получим ошибку:
java.lang.IllegalArgumentException: Could not resolve placeholder 'unknown.param' in value "${unknown.param}"