Для фокусов в конфигурационном файле Spring Boot достаточно этой статьи!

Spring Boot Java

существуетБыстрый стартВ этом разделе мы легко реализовали простое приложение RESTful API и испытали множество преимуществ, предоставляемых Spring Boot. Мы успешно реализовали веб-приложение с очень небольшим объемом кода. Это традиционный Spring Приложение не может этого сделать. Хотя мы используем тот же код при реализации контроллера с точки зрения конфигурации, я думаю, все заметили, что в приведенном выше примере конфигурация не вводится после конфигурации Maven.

Это то, о чем мы упоминали ранее, Spring Boot предоставляет ряд автоматических конфигураций для наших распространенных сценариев разработки, чтобы уменьшить исходный сложный и редко изменяемый шаблонный контент конфигурации. Однако нам все еще нужно понять, как изменить это содержимое автоматической конфигурации в Spring Boot, чтобы удовлетворить некоторые особые требования сценария, такие как: нам нужно запустить несколько веб-приложений на основе Spring Boot на одном хосте Каждое приложение указывает специальный номер порта , то порт по умолчанию 8080 неизбежно приведет к конфликтам.

Если вы все еще читаете мойСерия руководств по Spring Cloud, на самом деле много работы будет над конфигурационным файлом. Поэтому нам необходимо иметь глубокое понимание некоторых знаний о файлах конфигурации в Spring Boot, таких как: его метод настройки, как реализовать конфигурацию с несколькими средами и порядок загрузки информации о конфигурации.

Основы настройки

существуетБыстрый стартВ примере, когда мы представили инженерную структуру Spring Boot, мы упомянулиsrc/main/resourcesКаталог — это каталог конфигурации Spring Boot, поэтому, когда мы хотим создать персонализированную конфигурацию для приложения, он находится в этом каталоге.

Расположение файла конфигурации по умолчанию для Spring Boot:src/main/resources/application.properties. Конфигурация приложения Spring Boot может быть сконцентрирована в этом файле.В соответствии с различными начальными модулями, которые мы представляем, здесь может быть определена различная информация о конфигурации, такая как имя порта контейнера, информация о ссылке на базу данных, уровень журнала и т. д. Например, нам нужно настроить номер служебного порта веб-модуля, который можно найти вapplication.propertiesдобавлено вserver.port=8888Чтобы указать порт службы как 8888, вы также можете передатьspring.application.name=helloуказать имя приложения (это имя будет зарегистрировано как имя службы в приложении Spring Cloud).

В дополнение к традиционному файлу свойств файл конфигурации Spring Boot также поддерживает широко рекомендуемый файл YAML.

YAML (английское произношение: /ˈjæməl/, оканчивающееся на верблюдоподобный верблюд) — это легко читаемый формат для выражения последовательностей данных. YAML ссылается на многие другие языки, в том числе: C, Python, Perl, и черпает вдохновение из XML, формата данных для электронной почты (RFC 2822). Кларк Эванс впервые опубликовал язык в 2001 году, а Инги дот Нет и Орен Бен-Кики также были его соавторами. Несколько языков программирования или языков сценариев уже поддерживают (или анализируют) этот язык. YAML — это рекурсивная аббревиатура от «YAML — это не язык разметки» (YAML — это не язык разметки). Когда этот язык был разработан, YAML на самом деле означало: «Еще один язык разметки» (все еще язык разметки), но чтобы подчеркнуть, что язык ориентирован на данные, а не на разметку, и переименовать с обратной аббревиатурой. Синтаксис AML подобен другим языкам высокого уровня и может просто выражать формы данных, такие как списки, хэш-таблицы и скаляры. Он использует пробельные отступы и большое количество функций, зависящих от внешнего вида, и идеально подходит для выражения или редактирования структур данных, различных файлов конфигурации, дампа содержимого отладки, структур документов (например, многие форматы заголовков электронной почты очень близки к YAML). Хотя он больше подходит для выражения структур данных иерархической модели, существует также усовершенствованный синтаксис для выражения данных реляционной модели. Поскольку YAML использует пробелы и разрывы строк для разделения данных, он особенно подходит для операций grep/Python/Perl/Ruby. Наиболее доступная его функция — умело избегать различных закрытых символов, таких как: кавычки, различные скобки и т. д., эти символы станут сложными и трудно идентифицируемыми во вложенной структуре. -- Википедия

Формат конфигурации, принятый YAML, выражается не в виде простой пары ключ-значение, как конфигурация свойств, а в форме с отступом, похожей на схему. Например: следующий абзац информации о конфигурации YAML

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App

Его эквивалентная конфигурация свойств выглядит следующим образом.

environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App

С помощью метода конфигурации YAML мы видим, что информация о конфигурации имеет отступы пошагово, ее структура стала более четкой и удобной для чтения, а количество символов в содержимом конфигурации также значительно уменьшено. В дополнение к этому, YAML можно использовать в одном файле с помощьюspring.profilesсвойства для определения нескольких различных конфигураций среды. Например, следующий контент, указанный в качестве тестовой среды,server.portбудет использовать порт 8882; в рабочей средеserver.portбудет использовать порт 8883; если среда не указана,server.portБудет использоваться порт 8881.

server:
    port: 8881
---
spring:
    profiles: test
server:
    port: 8882
---
spring:
    profiles: prod
server:
    port: 8883

Примечание: YAML в настоящее время имеет некоторые недостатки, он не может пройти@PropertySourceАннотация для загрузки конфигурации. Однако, когда YAML загружает свойства в память и сохраняет их по порядку, когда информация в файле конфигурации должна иметь последовательное значение, метод конфигурации YAML имеет больше преимуществ, чем файл конфигурации свойств.

специальные параметры

Помимо установки предопределенных свойств конфигурации в каждом начальном модуле в файле конфигурации Spring Boot, мы также можем определить некоторые пользовательские свойства, которые нам нужны, в файле конфигурации. например, вapplication.propertiesдобавлять:

book.name=SpringCloudInAction
book.author=ZhaiYongchao

Затем в приложении мы можем передать@ValueАннотация для загрузки таких настраиваемых параметров, как:

@Component
public class Book {

    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;

    // 省略getter和setter
}

@ValueКогда аннотации загружают значения свойств, для конфигурации могут поддерживаться два выражения:

  • Одним из них является метод PlaceHolder, который мы представили выше, формат${...}, PlaceHolder в фигурных скобках
  • Кроме того, выражения SpEL (язык выражений Spring) также могут использоваться в формате#{...}, фигурные скобки - это выражения SpEL

ссылка на параметр

существуетapplication.propertiesМежду различными параметрами в , мы также можем напрямую ссылаться с помощью PlaceHolder, например, следующие настройки:

book.name=SpringCloud
book.author=ZhaiYongchao
book.desc=${book.author}  is writing《${book.name}》

book.descПараметр относится к определенному вышеbook.nameиbook.authorсвойство, окончательная стоимость свойстваZhaiYongchao is writing《SpringCloud》.

использовать случайные числа

В некоторых особых случаях мы надеемся, что некоторые параметры не имеют фиксированного значения при каждой загрузке, например: ключи, служебные порты и т. д. В файле конфигурации свойств Spring Boot мы можем сделать это, используя${random}Настройте для генерации случайных значений int, длинных значений или строковых строк, чтобы мы могли легко генерировать случайные свойства через конфигурацию, а не реализовывать эту логику через кодирование в программе.

${random}Существуют в основном следующие несколько методов настройки, читатели могут использовать их в качестве справки.

# 随机字符串
com.didispace.blog.value=${random.value}
# 随机int
com.didispace.blog.number=${random.int}
# 随机long
com.didispace.blog.bignumber=${random.long}
# 10以内的随机数
com.didispace.blog.test1=${random.int(10)}
# 10-20的随机数
com.didispace.blog.test2=${random.int[10,20]}

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

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

Напомним, что в кратком руководстве по этой главе мы также рассмотрели, как запустить приложение Spring Boot, в котором упоминалось использование командыjava -jarкоманда для запуска. Помимо запуска приложения, эта команда также может указывать параметры приложения в командной строке, например:java -jar xxx.jar --server.port=8888, установите свойство server.port прямо из командной строки и установите порт для запуска приложения на 8888.

При запуске приложения Spring Boot из командной строки два последовательных знака минус--верноapplication.propertiesИдентификатор значения атрибута в присваиваемом назначении. так,java -jar xxx.jar --server.port=8888команда, эквивалентная нашейapplication.propertiesдобавить атрибутserver.port=8888.

Изменение значений свойств через командную строку — очень важная функция Spring Boot, Теоретически благодаря этой функции свойства нашего приложения были сделаны переменными перед запуском, поэтому номер порта и подключение к базе данных — это все, что можно изменить. при запуске приложения, что отличается от предыдущего приложения Spring, использующего профиль Maven для создания различных сред в компиляторе. Самая большая разница заключается в том, что метод Spring Boot позволяет запускать упакованное содержимое приложения в процессе разработки, тестирования и онлайн-развертывания, в то время как различные решения Maven Profile создают пакеты в каждой среде, и их содержимое существенно отличается. Однако, если каждый параметр нужно указывать через командную строку, это явно не очень хорошее решение, поэтому давайте посмотрим, как реализовать мультисредовую конфигурацию в Spring Boot.

Конфигурация с несколькими средами

Когда мы разрабатываем какое-либо приложение, обычно один и тот же набор программ применяется и устанавливается в нескольких разных средах, таких как: разработка, тестирование, производство и т. д. Конфигурация адреса базы данных, порта сервера и т. д. для каждой среды будет разной.Если файлы конфигурации часто изменяются при упаковке для разных сред, это будет очень утомительно и подвержено ошибкам.

Для конфигурации с несколькими средами основные идеи различных инструментов или сред построения проектов одинаковы.Путем настройки нескольких файлов конфигурации для разных сред, а затем указания содержимого для упаковки с помощью команды упаковки упаковка различается, и Spring Boot не исключение. , а то и проще.

В Spring Boot имя файла конфигурации для нескольких сред должно соответствоватьapplication-{profile}.propertiesформат, где{profile}В соответствии с вашим идентификатором среды, например:

  • application-dev.properties: Среда разработки
  • application-test.properties:тестовая среда
  • application-prod.properties:Производственная среда

Что касается того, какой конкретный файл конфигурации будет загружен, он должен быть вapplication.propertiesчерез файлspring.profiles.activeсвойство для установки, его значение соответствует конфигурационному файлу{profile}ценность. как:spring.profiles.active=testбудет загружатьсяapplication-test.propertiesСодержимое файла конфигурации.

Ниже в качестве примера возьмите конфигурацию различных сервисных портов в разных средах для проведения пробных экспериментов.

  • Создайте отдельный файл конфигурации для каждой средыapplication-dev.properties,application-test.properties,application-prod.properties

  • Все три файла настроены на разныеserver.portСвойства, такие как: для среды разработки установлено значение 1111, для тестовой среды установлено значение 2222, для рабочей среды установлено значение 3333.

  • установить в application.propertiesspring.profiles.active=dev, то есть по умолчанию установлена ​​среда разработки

  • Тестовая загрузка разных конфигураций

  • воплощать в жизньjava -jar xxx.jar, можно заметить, что сервисный порт установлен на1111, которая является средой разработки по умолчанию (dev)

  • воплощать в жизньjava -jar xxx.jar --spring.profiles.active=test, можно заметить, что сервисный порт установлен на2222, то есть конфигурация тестовой среды (тест)

  • воплощать в жизньjava -jar xxx.jar --spring.profiles.active=prod, можно заметить, что сервисный порт установлен на3333, который является конфигурацией производственной среды (prod)

Согласно приведенным выше экспериментам, идеи конфигурации нескольких сред можно резюмировать следующим образом:

  • application.propertiesНастройте общий контент и установитеspring.profiles.active=dev, со средой разработки в качестве конфигурации по умолчанию
  • application-{profile}.propertiesНастройте различный контент для каждой среды в
  • Активируйте настройку различных сред через командную строку

порядок загрузки

В приведенном выше примере мы поместили все содержимое конфигурации, необходимое для приложения Spring Boot, в проект проекта, хотя мы смогли передатьspring.profiles.activeИли через Maven для поддержки нескольких сред. Однако, когда наша команда постепенно растет и разделение труда становится все более и более детальным, нам часто не нужно сообщать разработчикам подробности тестовой или производственной среды, но надеяться, что человек, отвечающий за каждую среду (QA или операционную и техническое обслуживание) для централизованного хранения этой информации. Затем, если содержимое конфигурации по-прежнему хранится таким образом, модификация конфигурации различных сред должна получить содержимое проекта для изменения содержимого конфигурации, что становится очень неудобным при наличии большого количества приложений. В то же время содержимое конфигурации видно разработчикам, что само по себе является угрозой безопасности. В связи с этим существует множество фреймворков и инструментов, которые экстернализируют содержимое конфигурации.Одним из них является Spring Cloud Config, который будет представлен позже.Чтобы лучше понять механизм загрузки Spring Cloud Config, нам необходимо понять данные Spring Boot. на данные.иметь определенное представление о механизме загрузки файла.

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

  1. Аргументы передаются в командной строке.
  2. SPRING_APPLICATION_JSONсвойства в .SPRING_APPLICATION_JSONЭто содержимое, настроенное в переменной системной среды в формате JSON.
  3. java:comp/envсерединаJNDIАтрибуты.
  4. Системные свойства Java, к которым можно получить доступ черезSystem.getProperties()полученный контент.
  5. Переменные среды операционной системы
  6. пройти черезrandom.*Настроенные случайные свойства
  7. Находится за пределами пакета jar текущего приложения для разных{profile}Содержимое файла конфигурации среды, например:application-{profile}.propertiesилиYAMLопределенный файл конфигурации
  8. Находится в текущем пакете jar приложения для разных{profile}Содержимое файла конфигурации среды, например:application-{profile}.propertiesилиYAMLопределенный файл конфигурации
  9. Вне текущего пакета jar приложенияapplication.propertiesиYAMLСодержание конфигурации
  10. Находится в текущем пакете jar приложения.application.propertiesиYAMLСодержание конфигурации
  11. существует@ConfigurationВ классе, модифицированном аннотацией,@PropertySourceСвойства, определяемые аннотациями
  12. Чтобы применить свойства по умолчанию, используйтеSpringApplication.setDefaultPropertiesчто определено

Приоритет от высокого к низкому в указанном выше порядке, чем меньше число, тем выше приоритет.

Видно, что 7-й и 9-й элементы оба считывают файлы конфигурации из-за пределов пакета jar приложения, поэтому принцип реализации внешней конфигурации заключается в том, чтобы вырезать из этого и указать место загрузки внешнего файла конфигурации, чтобы он заменил пакет jar содержимое конфигурации внутри. Благодаря такой реализации наш проект становится очень чистым в конфигурации, нам нужно только разместить конфигурацию, необходимую для разработки, локально, а конфигурацию других сред можно игнорировать, и человек, отвечающий за соответствующую среду, будет ее поддерживать.

2.х новые функции

В Spring Boot 2.0 была запущена Relaxed Binding 2.0, которая внесла множество улучшений в исходную функцию привязки свойств, чтобы упростить загрузку и чтение информации о конфигурации в приложениях Spring. В следующей статье будет рассказано об улучшениях конфигурации в Spring Boot 2.0.

привязка конфигурационного файла

простой тип

В Spring Boot 2.0 загружаются свойства конфигурации, за исключением версии 1.x.удалить специальные символыКроме того, конфигурация будетвсе в нижнем регистреспособ согласования и загрузки. Таким образом, следующие четыре метода конфигурации эквивалентны:

  • формат свойств:
spring.jpa.databaseplatform=mysql
spring.jpa.database-platform=mysql
spring.jpa.databasePlatform=mysql
spring.JPA.database_platform=mysql
  • ямл формат:
spring:
  jpa:
    databaseplatform: mysql
    database-platform: mysql
    databasePlatform: mysql
    database_platform: mysql

Советы: рекомендуется использовать все строчные буквы с-Разделитель для настройки, например:spring.jpa.database-platform=mysql

Тип списка

Использовать в файле свойств[]для поиска типов списков, таких как:

spring.my-example.url[0]=http://example.com
spring.my-example.url[1]=http://spring.io

также поддерживает использованиезапятаяРаздельная конфигурация, приведенная выше и следующая конфигурации эквивалентны:

spring.my-example.url=http://example.com,http://spring.io

И в файле yaml вы можете использовать следующую конфигурацию:

spring:
  my-example:
    url:
      - http://example.com
      - http://spring.io

также поддерживаетзапятаяКак разделить:

spring:
  my-example:
    url: http://example.com, http://spring.io

Примечание. В Spring Boot 2.0 конфигурация типа List должна быть непрерывной, в противном случаеUnboundConfigurationPropertiesExceptionисключение, поэтому следующая конфигурация не разрешена:

foo[0]=a
foo[2]=b

Вышеуказанная конфигурация возможна в Spring Boot 1.x,foo[1]Поскольку конфигурации нет, ее значение будет равноnull

Тип карты

Стандартная конфигурация типа Map в свойствах и yaml выглядит следующим образом:

  • формат свойств:
spring.my-example.foo=bar
spring.my-example.hello=world
  • ямл формат:
spring:
  my-example:
    foo: bar
    hello: world

Примечание. Если ключ типа Карта содержит не буквенно-цифровые-символы, вам нужно использовать[]Скобки, например:

spring:
  my-example:
    '[foo.baz]': bar

Привязка свойств среды

простой тип

в переменной среды путем преобразования нижнего регистра с помощью.заменять_Чтобы отобразить содержимое файла конфигурации, например: переменные средыSPRING_JPA_DATABASEPLATFORM=mysqlКонфигурация будет сгенерирована с настройками в конфигурационном файлеspring.jpa.databaseplatform=mysqlтот же эффект.

Тип списка

Невозможно использовать переменные среды[и]обозначение, поэтому используйте_заменить. Любое число, окруженное символом подчеркивания, будет считаться[]форма массива. Например:

MY_FOO_1_ = my.foo[1]
MY_FOO_1_BAR = my.foo[1].bar
MY_FOO_1_2_ = my.foo[1][2]

Кроме того, если последняя переменная среды заканчивается цифрой и символом подчеркивания, последний символ подчеркивания можно опустить.Например, первый и третий элементы в приведенном выше примере эквивалентны следующей конфигурации:

MY_FOO_1 = my.foo[1]
MY_FOO_1_2 = my.foo[1][2]

привязка системных свойств

простой тип

Системные свойства аналогичны тем, что в конфигурации файла.Они связываются удалением спецсимволов и переводом в нижний регистр.Например,будут настроены следующие параметры командной строки.spring.jpa.databaseplatform=mysqlЭффект:

-Dspring.jpa.database-platform=mysql
-Dspring.jpa.databasePlatform=mysql
-Dspring.JPA.database_platform=mysql

Тип списка

Привязка системных свойств также аналогична привязке свойств файла,[]указать, например:

-D"spring.my-example.url[0]=http://example.com"
-D"spring.my-example.url[1]=http://spring.io"

Точно так же он также поддерживает разделение запятыми, например:

-Dspring.my-example.url=http://example.com,http://spring.io

чтение свойства

Вышеприведенное описывает содержимое привязки свойств в Spring Boot 2.0.Мы видим, что у нас может быть много разных выражений для свойства, но если мы хотим прочитать свойства в среде приложения Spring, уникальное имя каждого свойства соответствует следующие правила:

  • пройти через.отдельные элементы
  • последний.Отдельный префикс от имени свойства
  • Должны быть буквы (a-z) и цифры (0-9)
  • Должен быть в нижнем регистре
  • через дефис-отделять слова
  • Допускаются только другие символы[и], для индекса списка
  • не может начинаться с цифры

Итак, если бы мы прочитали файл конфигурацииspring.jpa.database-platformКонфигурацию можно записать так:

this.environment.containsProperty("spring.jpa.database-platform")

И следующий способ не может получитьspring.jpa.database-platformСодержание конфигурации:

this.environment.containsProperty("spring.jpa.databasePlatform")

Примечание: используйте@ValueЭта функция также требуется при получении содержимого конфигурации.

Совершенно новый API привязки

Новый API привязки был добавлен в Spring Boot 2.0, чтобы упростить получение информации о конфигурации. Вот пример, который поможет вам легче понять:

Пример 1: простые типы

Предположим, в настройках свойств есть такая конфигурация:com.didispace.foo=bar

Создаем для него соответствующий класс конфигурации:

@Data
@ConfigurationProperties(prefix = "com.didispace")
public class FooProperties {

    private String foo;

}

Далее через последнююBinderВы можете получить информацию о конфигурации следующим образом:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);

        Binder binder = Binder.get(context.getEnvironment());

        // 绑定简单配置
        FooProperties foo = binder.bind("com.didispace", Bindable.of(FooProperties.class)).get();
        System.out.println(foo.getFoo());
    }
}

Пример 2: Тип списка

Что делать, если содержимое конфигурации имеет тип списка? Например:

com.didispace.post[0]=Why Spring Boot
com.didispace.post[1]=Why Spring Cloud

com.didispace.posts[0].title=Why Spring Boot
com.didispace.posts[0].content=It is perfect!
com.didispace.posts[1].title=Why Spring Cloud
com.didispace.posts[1].content=It is perfect too!

Получение этих конфигураций по-прежнему просто и может быть реализовано следующим образом:

ApplicationContext context = SpringApplication.run(Application.class, args);

Binder binder = Binder.get(context.getEnvironment());

// 绑定List配置
List<String> post = binder.bind("com.didispace.post", Bindable.listOf(String.class)).get();
System.out.println(post);

List<PostInfo> posts = binder.bind("com.didispace.posts", Bindable.listOf(PostInfo.class)).get();
System.out.println(posts);

пример кода

Репозитории для этого урока:

Если вы считаете, что эта статья хороша, добро пожаловать в Star and Follow! Ваше внимание является движущей силой для меня, чтобы настойчиво!

Связанное Чтение