Рубрики
Без рубрики

Свойства в учебном пособии Spring Boot 2

Узнайте о файлах свойств, свойствах среды и свойствах командной строки в Spring Boot 2 и о том, как их использовать с аннотацией @Value. С пометкой java, spring boot, учебное пособие.

Если вы только начинаете работать с Spring Boot 2, то этот пост для вас.

В качестве предварительного условия вы установили Java, Maven и IDE, такую как IntelliJ, и выполнили Создание веб-службы RESTful следующего уровня с помощью Spring Boot 2 post. В настоящее время у вас запущена веб-служба RESTful.

Давайте воспользуемся приложением приветствия из статьи “Создание веб-службы RESTful следующего уровня”, чтобы добавить и использовать свойство.

Первое, что вы заметите, это то, что в каталоге /src/main/resources этого приложения есть файл application.properties . Этот файл сейчас пуст. Этот файл был сгенерирован Spring Initializr при создании приложения. Помните, я упоминал, что команда Spring рекомендует запускать каждое приложение Spring Boot с помощью Spring Initializr.

Что это за файл? application.properties является одним из “источников свойств” по умолчанию, что означает, что это одно из мест, где Spring Boot будет искать свойства при запуске приложения. На самом деле Spring Boot ищет файл с именем application.properties в нескольких местах. Вы можете прочитать об этом в документации Spring Boot/| .

Вы можете хранить свойства для ваших приложений и служб Spring Boot 2 в файле application.properties в формате ключ-значение.

Откройте application.properties и добавьте строку:

defaultGreeting=Hello

Как только это будет сделано, вы можете использовать аннотацию @Value в любом месте вашего приложения для ссылки на это свойство. Аннотация @Value может ссылаться на переменные свойства с заполнителями, которые используют синтаксис ${myVariableName} . Вы можете прочитать больше о заполнителях в документации Spring Boot.

Открыть GreetingController.java (найдено где-то в /src/main/java/ ), и давайте не будем изменять переменную шаблона со статической переменной на переменную-член и аннотировать ее с помощью @Value("${defaultGreeting}") . Я также изменил имя переменной с template на greeting , потому что “шаблон” больше не является точным.

В результате получается вот что:

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/greeting")
public class GreetingController {
    private final AtomicLong counter = new AtomicLong();

    @Value("${defaultGreeting}")
    private String greeting;

    @GetMapping
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return customizeGreeting(name);
    }

    @PutMapping
    public ResponseEntity update(String greeting) {
        this.greeting = greeting;
        return ResponseEntity.ok(customizeGreeting("World"));
    }

    private Greeting customizeGreeting(String name) {
        return new Greeting(counter.incrementAndGet(), greeting + ", " + name);
    }
}

Обязательно создайте ( mvn package ), запустите ( java -jar target/yourjar.jar ), и проверьте это, прежде чем продолжить, точно так же, как вы делали перед использованием curl или Postman. Помните, что вы отправите запрос GET на http://localhost:8080/greeting .

Также попробуйте обновить значение Приветствие по умолчанию в application.properties . Вы заметите, что когда вы меняете его во время работы приложения, ничего не происходит. Вы должны остановить приложение, перестроить его и повторно запустить, чтобы приложение восприняло изменения.

В настоящее время у вас есть свойство Приветствие по умолчанию в application.properties и ты знаешь, как это изменить.

Часть перестройки и повторного запуска при изменении свойства подходит для некоторых вещей, но это может быть не совсем то, что вы хотите.

Что, если бы вы могли установить это свойство в любое время при запуске приложения, не изменяя файл application.properties и не перестраивая его?

К счастью, вы можете это сделать. В настоящее время вы запускаете приложение следующим образом:

java -jar target/greeting-0.0.1-SNAPSHOT.jar

(Обратите внимание, что вы, возможно, назвали свое приложение как-то иначе, кроме “приветствие”, чтобы оно отображалось в имени файла jar вместо этого.)

На самом деле вы можете передавать свойства в качестве аргументов этой команде run. Попробуйте это и посмотрите, что получится:

java -DdefaultGreeting="Hey" -jar target/greeting-0.0.1-SNAPSHOT.jar

Если вы проверите это, вы заметите, что приветствие по умолчанию изменилось на “Привет”, как и ожидалось.

Одна из основных причин использования свойств заключается в том, что ваше приложение может запускаться на разных компьютерах, но быть каким-то образом настроено для компьютера, на котором оно запущено. Возможно, вы проводите различие между разработчиком или тестовой машиной и производственной машиной. Или, может быть, разница просто в том, кто запускает приложение.

В этом приложении приветствия, что, если бы мы могли использовать имя пользователя из среды, чтобы установить человека по умолчанию, для которого предназначено приветствие?

Это на самом деле довольно просто с Spring Boot! Предполагая, что вы используете оболочку BASH, у вас должна быть переменная среды $USER . Откройте терминал и попробуйте ввести echo $USER и вы должны увидеть свое имя пользователя. Если на вашем компьютере нет оболочки BASH, прежде чем продолжить, узнайте, как установить переменную среды с именем USER для вашей операционной системы, и установите для нее значение вашего имени пользователя.

Итак, мы знаем, что хотим сослаться на переменную окружения с именем $USER . Можете ли вы подумать о том, как вы могли бы изменить код, чтобы сделать это? (Подсказка: использование аннотации @Value .)

Как бы глупо это ни звучало, вы можете напрямую ссылаться на переменные окружения в @Value аннотациях в Spring Boot, потому что он автоматически загружает их. Переменные среды – это источник свойств по умолчанию, который приложение заполняет при загрузке.

Таким образом, вы, по сути, просто добавляете @Value("${USER}") . Продолжайте и добавьте член класса с именем user, представляющий собой строку.

Теперь вы захотите сделать так, чтобы по умолчанию переменной name было присвоено это значение. Вы можете подумать, что мы можем просто установить defaultValue атрибут @RequestParam для нашей новой пользовательской переменной, но это не будет разрешено, поскольку для этого требуется использование константы. Так что вместо этого давайте просто удалим это. Следующее, с чем мы сталкиваемся, – это то, что по умолчанию параметры запроса являются обязательными, но вы можете установить атрибут required , поэтому я собираюсь это сделать. Теперь я собираюсь пойти дальше и просто проверить, является ли имя null когда мы его получим, и в этом случае установим для него значение user. Мой окончательный код выглядит следующим образом:

@RestController
@RequestMapping("/greeting")
public class GreetingController {
    private final AtomicLong counter = new AtomicLong();

    @Value("${defaultGreeting}")
    private String greeting;

    @Value("${USER}")
    private String user = "World";

    @GetMapping
    public Greeting greeting(@RequestParam(value = "name", required = false) String name) {
        if(name == null) {
            name = user;
        }
        return customizeGreeting(name);
    }

    @PutMapping
    public ResponseEntity update(String greeting) {
        this.greeting = greeting;
        return ResponseEntity.ok(customizeGreeting("World"));
    }

    private Greeting customizeGreeting(String name) {
        return new Greeting(counter.incrementAndGet(), greeting + ", " + name);
    }
}

С учетом этих изменений я перестраиваю и повторно запускаю приложение, и теперь по умолчанию ответ на мой запрос GET звучит так: “Привет, скоттши”, потому что “скоттши” – это имя пользователя, которое я выбрал на этом компьютере. Когда вы запустите его, вместо этого вы должны увидеть свое имя пользователя.

В этом посте вы узнали, как предоставить конфигурацию (свойства) приложению Spring Boot с помощью:

  • переменные среды

  • аргументы командной строки

  • аргументы командной строки

. . и используйте их с помощью аннотации @Value .

В следующем посте я расскажу о других способах использования свойств.

Если вы готовы узнать больше прямо сейчас, ознакомьтесь со справочным руководством Spring Boot/|, где вы можете узнать:

  • дополнительные источники свойств по умолчанию

  • порядок оценки, которому следует Spring Boot, чтобы определить, какие свойства выигрывают

Оригинал: “https://dev.to/scottshipp/properties-in-spring-boot-2-tutorial-24cf”