Конфигурация Spring Boot приложения

В этой статье мы рассмотрим, как задать свойства Spring Boot приложения в файле application.properties, а также как получить доступ ко всем свойствам (не только заданным в application.properties) из приложения во время его работы.

Источники свойств

Spring Boot приложение может обращаться к свойствам из внешних источников:

  • переменным среды ОС,
  • к Java System Properties,
  • к специальным свойствам Spring Boot приложения, заданным в application.properties.
  • и многим другим — всего более десятка источников

Все эти свойства во время работы приложения собираются в бине Environment. Если внедрить бин Environment, то в режиме отладки можно посмотреть все эти списки свойств:

Бин Environment
Бин Environment

Мы для примера попробуем добавить и вывести одно свойство System Properties и пару свойств application.properties. Чаще всего используется именно application.properties.

application.properties

Зададим в application.properties пару свойств:

app.n=1
app.m=2
Аналог application.propertiesapplication.yml. Можно задавать свойства в любом формате, без разницы.

System Properties

Чтобы задать System Property, на вкладке Run Configuration  пропишем VM options:

-Dprop1=prop1
VM Options
VM Options

Пока хватит.

Теперь рассмотрим, как получить доступ к этим свойствам из кода.

Доступ к свойствам

Можно внедрить отдельное свойство с помощью @Value.  Также можно внедрить же целую серию свойств с помощью класса

Внедрение свойства с помощью @Value

Чтобы внедрить свойство в помощью @Value, используем ${…}:

@SpringBootApplication
public class MainApplication  {


    @Value("${app.n}")
    private int n;

    @Value("${app.m}")
    private int m;

    @Value("${prop1}")
    private String prop1;

    @Value("${TEMP}")
    private String temp;

    @PostConstruct
    void print(){
        
        System.out.println(n);
        System.out.println(m);
        System.out.println(temp);
        System.out.println(prop1);
    }


    public static void main(String[] args) throws InterruptedException {
             SpringApplication.run(MainApplication.class, args);

    }
}

Мы внедрили свойства:

  • из application.properties 
  • и переменную среды TEMP
  • System Property, заданное в VM options

В консоли выводятся значения:

1
2
C:\Users\myluc\AppData\Local\Temp
prop1
Обратите внимание, что если бы имена свойств случайно совпали, то переменная среды перекрыла бы свойство из application.properties, а System Property перекрыло бы переменную среды. Приоритеты источников указаны по ссылке на все источники свойств выше.

 

@ConfigurationProperties

Можно также выделить серию свойств из файла application.properties и создать для нее отдельный класс, который можно внедрять. На первый взгляд такой вариант кажется сложнее, но он подходит, если свойств много.

Например, выделим из  application.properties свойства, начинающиеся с app (у нас это все свойства, других нет):

app.n=1
app.m=2

Создадим под них класс AppProperties:

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private int n;
    private int m;


   //getters/setters
}

Класс аннотирован @Configuration и @ConfigurationProperties, и внутри указан префикс app — это означает, что в AppProperties внедрятся свойства, начинающиеся с app.

Теперь бин AppProperties  будет содержать свойства из application.properties. Его можно внедрять и через него получать свойства как поля бина:

@SpringBootApplication
public class MainApplication  {
 
    @Autowired
    private AppProperties appProperties;

    @PostConstruct
    void print(){

        System.out.println(appProperties.getN());
        System.out.println(appProperties.getM());

    }


    public static void main(String[] args) throws InterruptedException {
             SpringApplication.run(MainApplication.class, args);

    }
}

Это альтернатива аннотации @Value.

Итоги

Мы рассмотрели, откуда берутся свойства для Spring Boot приложения и как получить к ним доступ. Код примера есть на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *