существуетБыстрый стартВ этом разделе мы легко реализовали простое приложение 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.properties
spring.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 использует следующий специальный порядок загрузки свойств:
- Аргументы передаются в командной строке.
-
SPRING_APPLICATION_JSON
свойства в .SPRING_APPLICATION_JSON
Это содержимое, настроенное в переменной системной среды в формате JSON. -
java:comp/env
серединаJNDI
Атрибуты. - Системные свойства Java, к которым можно получить доступ через
System.getProperties()
полученный контент. - Переменные среды операционной системы
- пройти через
random.*
Настроенные случайные свойства - Находится за пределами пакета jar текущего приложения для разных
{profile}
Содержимое файла конфигурации среды, например:application-{profile}.properties
илиYAML
определенный файл конфигурации - Находится в текущем пакете jar приложения для разных
{profile}
Содержимое файла конфигурации среды, например:application-{profile}.properties
илиYAML
определенный файл конфигурации - Вне текущего пакета jar приложения
application.properties
иYAML
Содержание конфигурации - Находится в текущем пакете jar приложения.
application.properties
иYAML
Содержание конфигурации - существует
@Configuration
В классе, модифицированном аннотацией,@PropertySource
Свойства, определяемые аннотациями - Чтобы применить свойства по умолчанию, используйте
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);
пример кода
Репозитории для этого урока:
- Гитхаб:GitHub.com/first87112/sp…
- Гостиница:git ee.com/brother space/S…
Если вы считаете, что эта статья хороша, добро пожаловать в Star and Follow! Ваше внимание является движущей силой для меня, чтобы настойчиво!