Spring Boot Версия 2.7.8 Исходный текст: https://docs.spring.io/spring-boot/docs/2.7.8/reference/htmlsingle/ — 笔者注:
Spring Boot 3.x первый GA Версия вышла в конце 22Год, 2.7.8 это 2.x последний GAВерсия, я думаю 2.х еще какое-то время будет основной
В этом разделе обсуждается весна Boot представляет А как Установить, мы Воля поможем вам построитьпервый Spring Boot приложения, обсуждая при этом некоторые основные принципы.
Spring Boot помогает создавать приложения Spring промышленного уровня, которые могут работать независимо.
Весна, которую ты создал Boot приложение,Можетпроходитьjava -jar
или ТрадицияизwarСумказапуск режима,кроме того Также предоставляетбегатьspring scripts
из Инструменты командной строки。
Spring Boot 2.7.8 Требуется Java8 , совместим с Java19, Spring Версия5.3.25иливыше。
Инструменты сборки | Версия |
---|---|
Maven | 3.5+ |
Gradle | 6.8.x, 6.9.x, and 7.x |
Spring Boot поддерживает следующие встроенные контейнеры сервлетов:
имя | Servlet Версия |
---|---|
Tomcat 9.0 | 4.0 |
Jetty 9.4 | 3.1 |
Jetty 10.0 | 4.0 |
Undertow 2.0 | 4.0 |
Вы также можете развернуть Spring Boot в любом контейнере, совместимом с сервлетами 3.1+.
Установить Доиспользоватьjava -version
исследовать Java Версия,Spring Boot 2.7.8 Требуется Java8 иливышеиз Версия。
Spring Boot Зависимостииспользоватьorg.springframework.boot
groupId
。в целом,тыизMaven POMФайлы, унаследованные отspring-boot-starter-parent
и объявите одну или несколько зависимостей «Starter».
Кроме того, весна Boot Также предоставляется дополнительный Maven. Плагин для создания исполняемого jar-файла, дополнительную информацию см. Документация по плагину Spring Boot Maven。
То же имя,Прыжок Boot также обеспечивает Плагин Gradle, используемый для создания исполняемых файлов jar. Дополнительную информацию см. Документация по плагину Spring Boot Gradle。
Spring Boot CLI — это инструмент командной строки, который можно использовать для быстрого создания приложений инициализации Spring Boot, что очень полезно, если у вас нет IDE.
Вы можете скачать Spring по следующему адресу CLIизданный Версия:
Также предоставлено Список снимков
После загрузки,Следуйте инструкциям, чтобы распаковать архив.изINSTALL.txtИнструкции по эксплуатации。.zipдокументизbin/В каталоге есть такойspringСкрипт(Применимо кWindowsизspring.bat),или Можетиспользоватьjar -jar
бегать пакет из баночки.
SDKMAN (Менеджер средств разработки программного обеспечения) можно использовать для управления различными двоичными SDK, включая Groovy и Spring. Boot CLI。отsdkman.ioПолучите ииспользовать Следующая команда Установить Spring Boot:
$ sdk install springboot
$ spring --version
Spring CLI v2.7.8
Если вы используете функцию разработки CLI и хотите получить доступ к своей сборке версии, используйте следующую команду:
$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.7.8-bin/spring-2.7.8/
$ sdk default springboot dev
$ spring --version
Spring CLI v2.7.8
Переднийизиллюстрировать Установитьполучил одинspring
названныйinstance изместныйdev
Пример。это指向тыиз Цельстроить Расположение,Итак, каждый раз, когда вы пересобираете Spring Boot,spring
это все самое последнееиз。
Посмотреть его можно следующей командой:
$ sdk ls springboot
================================================================================
Available Springboot Versions
================================================================================
> + dev
* 2.7.8
================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
существоватьMacначальство МожетиспользоватьHomebrewУстановить。
$ brew tap spring-io/tap
$ brew install spring-boot
Homebrew Установить spring
приезжать /usr/local/bin
.
если Невозможно найти команду приехать,пытатьсяиспользовать
brew update
Попробуйте еще раз после обновления
существоватьMacначальствоиспользоватьMacPorts Установить。
$ sudo port install spring-boot-cli
существоватьWindowиспользоватьScoopУстановить。
> scoop bucket add extras
> scoop install springboot
Scoop Установить spring
приезжать ~/scoop/apps/springboot/current/bin
если команда приглашения не существует,пожалуйстаиспользовать
scoop update
Обновите и попробуйте еще раз
首先创建одинназванныйapp.groovy
издокумент。
@RestController
class ThisWillActuallyRun {
@RequestMapping("/")
String home() {
"Hello World!"
}
}
Затемиспользоватьнравитьсяотдавать приказыбегать:
$ spring run app.groovy
Первый раз нужно скачать зависимости,будет медленнее,Позже запуск будет намного быстрее.
наконец,использовать Браузер открываетсяlocalhost:8080
,выход
Hello World!
предположениеиспользоватьstart.spring.io Создать весну Boot приложение.
Обновление с версии 1.x,Может ПроверятьGitHub Руководство по обновлению на вики
Spring Boot предоставляет возможность анализировать среду приложения и распечатывать диагностическую информацию при запуске.,Вы также можете временно перенести атрибуты во время разработки.,Чтобы активировать эту функцию,Добавьте в проект следующие зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
После завершения обновления удалите зависимость.
Можно использовать систему сборки Maven, Gradle, Ant.
Все официальные лаунчеры следуют чему-то вродеизшаблон именования:spring-boot-starter-*
,в*
это особый типизприложение,если нужно создать свой собственный лаунчер, обычно начинающийся с имени проекта,нравитьсяthirdpartyproject-spring-boot-starter
。
Spring Boot Предоставляются следующие средства запуска приложенийorg.springframework.boot
:
имя | описывать |
---|---|
spring-boot-starter | Базовый старт, включая поддержку автоконфигурации, ведение журнала и YAML. |
spring-boot-starter-activemq | Инструмент обмена сообщениями JMS с использованием Apache ActiveMQ |
spring-boot-starter-amqp | Активатор для использования Spring AMQP и Rabbit MQ |
spring-boot-starter-aop | Введение в аспектно-ориентированное программирование с использованием Spring AOP и AspectJ. |
spring-boot-starter-artemis | Инструмент обмена сообщениями JMS с использованием Apache Artemis |
spring-boot-starter-batch | Использование стартера Spring Batch |
spring-boot-starter-cache | Начало использования поддержки кэширования Spring Framework |
spring-boot-starter-data-cassandra | Стартер с использованием распределенной базы данных Cassandra и Spring Data Cassandra |
spring-boot-starter-data-cassandra-reactive | Стартер для использования распределенной базы данных Cassandra и Spring Data Cassandra Reactive |
spring-boot-starter-data-couchbase | Использование документально-ориентированной базы данных Couchbase и стартовой версии Spring Data Couchbase. |
spring-boot-starter-data-couchbase-reactive | Начало работы с документо-ориентированной базой данных Couchbase и Spring Data Couchbase Reactive. |
spring-boot-starter-data-elasticsearch | Начало использования системы поиска и аналитики Elasticsearch и Spring Data Elasticsearch. |
spring-boot-starter-data-jdbc | Панель запуска с использованием Spring Data JDBC |
spring-boot-starter-data-jpa | Активатор для использования Spring Data JPA с Hibernate |
spring-boot-starter-data-ldap | Активатор с использованием Spring Data LDAP |
spring-boot-starter-data-mongodb | Использование документо-ориентированной базы данных MongoDB и стартовой версии Spring Data MongoDB. |
spring-boot-starter-data-mongodb-reactive | Стартер с использованием базы данных документов MongoDB и Spring Data MongoDB Reactive. |
spring-boot-starter-data-neo4j | Стартер для использования графовой базы данных Neo4j и Spring Data Neo4j. |
spring-boot-starter-data-r2dbc | Панель запуска с использованием Spring Data R2DBC |
spring-boot-starter-data-redis | Начало использования хранилища данных Redis «ключ-значение» с клиентами Spring Data Redis и Lettuce. |
spring-boot-starter-data-redis-reactive | Активатор для использования хранилища данных Redis «ключ-значение» с реактивными клиентами Spring Data Redis и клиентами Lettuce. |
spring-boot-starter-data-rest | Стартер для предоставления репозиториев Spring Data через REST с использованием Spring Data REST. |
spring-boot-starter-freemarker | Создайте средство запуска для веб-приложений MVC, используя представления FreeMarker. |
spring-boot-starter-graphql | Стартер для создания приложений GraphQL с использованием Spring GraphQL |
spring-boot-starter-groovy-templates | Стартер для создания веб-приложений MVC с использованием представлений шаблонов Groovy. |
spring-boot-starter-hateoas | Стартер для создания веб-приложений RESTful на основе гипермедиа с использованием Spring MVC и Spring HATEOAS. |
spring-boot-starter-integration | Использование стартера Spring Integration |
spring-boot-starter-jdbc | Средство запуска для использования JDBC с пулом соединений HikariCP. |
spring-boot-starter-jersey | Стартер для создания веб-приложений RESTful с использованием JAX-RS и Jersey. Альтернативы Spring-Boot-Starter-Web |
spring-boot-starter-jooq | Лаунчер для доступа к базам данных SQL через JDBC с помощью jOOQ. Альтернатива Spring-boot-starter-data-jpa или Spring-boot-starter-jdbc |
spring-boot-starter-json | Стартер для чтения и написания json |
spring-boot-starter-jta-atomikos | Стартер транзакций JTA с использованием Atomikos |
spring-boot-starter-mail | Отправка электронной почты поддерживается для начинающих с использованием Java Mail и Spring Framework. |
spring-boot-starter-mustache | Создайте средство запуска для веб-приложений, используя представления Mustache. |
spring-boot-starter-oauth2-client | Стартер для использования клиентских функций Spring Security OAuth2/OpenID Connect. |
spring-boot-starter-oauth2-resource-server | Активатор для использования функциональности сервера ресурсов OAuth2 Spring Security. |
spring-boot-starter-quartz | Лаунчер с использованием планировщика Quartz |
spring-boot-starter-rsocket | Стартер для создания клиентов и серверов RSocket. |
spring-boot-starter-security | Использование стартера Spring Security |
spring-boot-starter-test | Стартер для тестирования приложений Spring Boot с использованием таких библиотек, как JUnit Jupiter, Hamcrest и Mockito. |
spring-boot-starter-thymeleaf | Создайте средство запуска для веб-приложений MVC, используя представления Thymeleaf. |
spring-boot-starter-validation | Стартер для использования проверки Java Bean с Hibernate Validator |
spring-boot-starter-web | Стартер для создания веб-приложений (включая RESTful) с использованием Spring MVC. Используйте Tomcat в качестве встроенного контейнера по умолчанию. |
spring-boot-starter-web-services | Использование стартера для веб-сервисов Spring |
spring-boot-starter-webflux | Стартер для создания приложений WebFlux с использованием поддержки Reactive Web Spring Framework. |
spring-boot-starter-websocket | Стартер для создания приложений WebSocket с использованием поддержки Spring MVC WebSocket в Spring Framework. |
В дополнение к лаунчеру приложений,возвращаться Можетиспользовать Следующий лаунчер для добавления*производство готово*Функция:
имя | описывать |
---|---|
spring-boot-starter-actuator | Начало использования Spring Boot Actuator, который предоставляет готовые к использованию функции, которые помогут вам отслеживать и управлять вашими приложениями. |
Наконец, Spring Boot также включает в себя следующие стартовые компоненты:
имя | описывать |
---|---|
spring-boot-starter-jetty | Альтернатива использованию Jetty в качестве стартовой платформы для встроенных контейнеров сервлетов |
spring-boot-starter-log4j2 | Альтернатива Spring-Boot-Starter-Log для начинающих, использующих Log4j2. |
spring-boot-starter-logging | Активатор для ведения журнала с помощью Logback. Активатор ведения журнала по умолчанию |
spring-boot-starter-reactor-netty | Используйте Reactor Netty в качестве основы для встроенного реактивного HTTP-сервера. |
spring-boot-starter-tomcat | Используйте Tomcat в качестве средства запуска встроенных контейнеров сервлетов. Используемый по умолчанию стартёр контейнера сервлетов — Spring-boot-starter-web. |
spring-boot-starter-undertow | Использование Undertow в качестве стартовой альтернативы для встроенных контейнеров сервлетов |
Список других стартеров, внесенных сообществом, см. на GitHub. Верхний модуль серединаизФайл Readme.
spring-boot-starters
Spring Boot не имеет фиксированного макета кода, но на некоторые практики можно ссылаться.
Когда в классе нет Сумка Содержитpackage
час,это被认длясуществовать“default package". Обычно не рекомендуется использовать "default". package”,это может вызвать@ComponentScan
、@ConfigurationPropertiesScan
、@EntityScan
или@SpringBootApplication
аннотация Что-то пошло не так,Мы должны следовать рекомендованному стилю именования из Сумка.,напримерcom.example.project
Обычно рекомендуется Воля Основной. класс программыпомещатьсуществоватьдругойдобрый之начальствоизкорень Сумкасередина,@SpringBootApplication
в целомпомещатьсуществовать主добрыйсередина,Его неявное значение определяет базовую функциональность поиска по сумме.,Введено внутри компании@EnableAutoConfiguration
и@ComponentScan
。
Вот типичный макет:
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
MyApplication.java
определениеполучил одинmain
методы и@SpringBootApplication
,Как показано ниже:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Spring Boot Поддерживает настройку с использованием Java, хотя SpringApplication иXMLМожет Вместеиспользовать,但возвращатьсядапредположение@Configuration
независимиздобрый。
вам не нужно помещать всеиз@Configuration
помещатьприезжатьодиндобрыйсередина,Должен@Import
аннотация Может использоваться для импорта другихиз Класс конфигурации,или Можетиспользовать@ComponentScan
Автоматически получить всеизSpring компоненты,Сумкавключать@Configuration
добрый。
если вам все равно придется использовать конфигурацию XML,依然предположениеиспользовать@Configuration
добрый,Затемиспользовать@ImportResource
загрузитьXMLКонфигурация。
Spring Загрузочный попробую Волястартеравтоматический конфигурацияприезжатьприложение,напримерпредставилHSQLDB
изstarter,Но никакие компоненты подключения к базе данных не настраиваются вручную.,ТакSpring Boot База данных в памяти будет настроена автоматически.
включатьавтоматическая конфигурация,Нужно добавить@EnableAutoConfiguration
или@SpringBootApplication
。
автоматическая конфигурация ненавязчива и может быть заменена в любой момент на автоматическую автоматическую конфигурацию. конфигурацияизназначенный отделточка,например,добавленDataSource
bean, встроенная база данных по умолчанию будет заменена.
использовать--debug
запускатьприложение,Можно распечатать, какая автоматическая модификация применяется в данный момент.
если хотите отключить указанную автоматическую конфигурациядобрый,Можетиспользовать@SpringBootApplication
изexclude
свойство,нравиться:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
еслиexcludeizClass отсутствует в пути к классам,МожетиспользоватьexcludeName
обозначениедобрыйизполное имя,кроме тогоесли Не нужно@SpringBootApplication
,@EnableAutoConfiguration
изexclude
иexcludeName
Также доступениз。
наконец Также работаетspring.autoconfigure.exclude
из Конфигурация来排除автоматическая конфигурациядобрый。
Обычно рекомендуется внедрять зависимости в конструктор.,и@ComponentScan
Находитьbean。
если это код согласно способу сборки 4.2из,но Можетиспользовать@ComponentScan
без каких-либо параметровилииспользовать@SpringBootApplication
это уже Сумка Содержит Понятно@ComponentScan
аннотация,так всеизкомпоненты(@Component
、@Service
、@Repository
、@Controller
идругой)будет автоматически зарегистрирован какSpring Beans。
нравиться Следующий пример представляет собой@Service
использоватьконструктор для внедренияRiskAssessor
Bean。
import org.springframework.stereotype.Service;
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
если у компонента есть несколько конструкторов,нуждатьсяиспользовать@Autowired
отметка哪个нуждатьсяSpring инъекция:
import java.io.PrintStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
Чтобы использовать внедрение конструктора, вы должны использовать
final
отметка,Указывает, что его нельзя изменить позже.
использовать@SpringBootApplication
аннотация Можетдавать возможностьнравиться Вниз三个Функция:
@EnableAutoConfiguration
: Включить весну Boot изавтоматическая механизм конфигурации
@ComponentScan @Component
:существоватьприложение所существоватьиз Сумканачальстводавать возможность扫描
@SpringBootConfiguration
: Позволяет регистрировать дополнения в контексте beans или импортируйте дополнительные файлы из Класс конфигурации。Spring стандартныйизальтернатива@Configuration
,Помогает обнаружить конфигурацию в интеграционных тестах.import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Если вы не хотите использовать @SpringBootApplication, вы также можете использовать только аннотацию. В следующем примере @ComponentScan не используется. 自动扫描Функция,ииспользоватьпоказать импорт(@Import
):
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Import;
@SpringBootConfiguration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ SomeConfiguration.class, AnotherConfiguration.class })
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
использоватьjava -jar
бегать:
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
Также возможно подключить удаленный отладчик:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
Spring Boot Maven плагин Сумка Содержитодинrun
Заказ:
$ mvn spring-boot:run
кроме тоговозвращаться МожетиспользоватьMAVEN_OPTS
Установите переменные среды:
$ export MAVEN_OPTS=-Xmx1024m
Gradleплагин Сумка СодержитодинbootRun
Заказ:
$ gradle bootRun
использоватьJAVA_OPTS
Установите переменные среды:
$ export JAVA_OPTS=-Xmx1024m
Spring Boot изгорячая заменана основеJVM,JVM ограничена определенной программой, которая может заменить байт-код,для完整方案МожетиспользоватьJRebel 。
spring-boot-devtools
модуль также Сумкавключатьверноприложение Быстрый перезапускизподдерживать,Подробности смотрите позжеизГорячая замена: «Как это сделать»。
Spring Boot поставлятьspring-boot-devtools
模块поставлятьоткрыть发часиздополнительный Функция,Для поддержки этой функции,Зависимость Воля необходимо добавить в проект проживания:
Maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
По умолчанию,бить Сумкаизприложение Нет Сумка Содержитdevtools,если хотите использовать определенную функцию удаленного инструмента разработки,Настроить в плагине Maven,исключение Devtools имеет значение false,Gradleплагинсередина КонфигурацияtaskЗадача начинается с Сумка СодержитdevelopmentOnly
,нравиться
tasks.named("bootWar") {
classpath configurations.developmentOnly
}
При игре Сумка выдает приложение,Инструменты разработчика Воля автоматически отключается. если Ваше приложение запускается из специального загрузчика классаизили использовать
java -jar
,Так会被认длядаодин"Производствоизприложение"。Можетиспользоватьspring.devtools.restart.enabled
контролировать,Чтобы включить инструменты разработчика,использовать-Dspring.devtools.restart.enabled=true
запускать,Чтобы отключить инструменты разработчика,排除Зависимостиилииспользовать-Dspring.devtools.restart.enabled=false
запускать。
Использование Maven опционального Gradleuse developmentOnly, что означает, что вы можете предотвратить передачу инструментов разработчика для приезда проекта из других модулей.
Функция перезапуска реализуется двумя загрузчиками классов.,Это хорошо работает для большинства приложений,Но иногда это вызывает проблемы с загрузкой классов.,Особенно в многомодульных проектах.
Чтобы определить, связано ли это с этой проблемой,Можетпытаться Отключить перезапуск,использоватьspring.devtools.restart.enabled=false
свойство禁用это。
Кроме того, вы можете Пользовательский загрузчик классов перезапуска,Настройте, какой класс загружается,Посмотреть подробности[4.8.3Автоматический перезапуск](#4.8.3 Автоматический перезапуск)。
Spring Boot Некоторые библиотеки кэшируют для повышения производительности.Например, механизм шаблонов кэширует скомпилированный шаблон, чтобы избежать повторного анализа, но таким образом мы не можем видеть изменения в шаблоне в реальном времени в процессе разработки. весна-загрузка-devtools Кэширование отключено по умолчанию.
В следующей таблице перечислены свойства всех приложений:
имя | значение по умолчанию |
---|---|
server.error.include-binding-errors | always |
server.error.include-message | always |
server.error.include-stacktrace | always |
server.servlet.jsp.init-parameters.development | true |
server.servlet.session.persistent | true |
spring.freemarker.cache | false |
spring.graphql.graphiql.enabled | true |
spring.groovy.template.cache | false |
spring.h2.console.enabled | true |
spring.mustache.servlet.cache | false |
spring.mvc.log-resolved-exception | true |
spring.template.provider.cache | false |
spring.thymeleaf.cache | false |
spring.web.resources.cache.period | 0 |
spring.web.resources.chain.cache | false |
если не хотите применять значение атрибута по умолчанию,Можетсуществоватьприложение Конфигурациядокументсередина Конфигурация
spring.devtools.add-properties=false
При разработке WEB-приложений,МожетвключатьDEBUG
бревно,Это отобразит запрос и процедуры обработки.,Результаты ответов и другие подробности,еслихочу показать всеиз Подробности(например潜существоватьизконфиденциальная информация),Можетбитьоткрытьspring.mvc.log-request-details
илиspring.codec.log-request-details
。
⚠️Примечание автора: Журнал после включения Spring.mvc.log-request-details
Журнал после закрытия Spring.mvc.log-request-details:
Всякий раз, когда файл в пути к классам изменяется,использовать Понятноspring-boot-devtools
изприложение Воля Автоматический перезапуск, но некоторые ресурсы (например, статические ресурсы и шаблоны представлений) не требуют перезапуска приложения.
Как вызвать перезагрузку: Спасибо DevTools Этот прослушивает ресурсы на пути к классу для запуска перезапуска, поэтому независимо от того, какую IDE необходимо перекомпилировать, прежде чем она сможет вызвать перезапуск: Eclipse , после сохранения модификации файл класса будет обновлен и произойдет перезагрузка. В IDEA через сборку курокили Редактировать проектиз
Edit Configurations -> On Update action:Update classes and resources
также Можеткурок重启 использовать Инструменты сборки,mvn compile
илиgradle build
Можеткурок重启⚠️Примечание автора: Советы по официальной документации: использоватьMavenилиGradle,нуждаться Воля
forking
установлен наenabled
,才能курок重启。 Фактическое измерение,новый Версияизspring-boot-maven-plugin
существоватьпроект引入spring-boot-devtools
назад会自动включатьfork
,нравитьсякартина:
Комментарии плагина также помечаются как устаревшие и будут полностью удалены в версии 3.0.0:
во время перезапуска DevTools Зависит от контекста приложения shutdown hook закрыть,еслиустановлен наSpringApplication.setRegisterShutdownHook(false)
,приведет к тому, что он не сможет работать должным образом.
⚠️Примечание автора:
После того, как автор так настроил, я обнаружил, что автоматический перезапуск не подвел.
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringBootDemoApplication.class);
application.setRegisterShutdownHook(false);
application.run(args);
}
Аспекты AspectJ не поддерживают автоматический перезапуск.
Перезагрузите и перезагрузите
Технология Spring Boot из перезапуска позволяетиспользовать два загрузчика классов для работы,Не изменится класс из (например: сторонний класс jariz), загруженный в загрузчик базового класса прибытия.,Часто изменяемые классы загружаются в перезапущенный загрузчик классов. Когда приложение перезапускается,Старый загрузчик классов из перезапуска удаляется и создается новый загрузчик классов.,Этот метод будет выполнять «холодный запуск» гораздо быстрее.,Потому что загрузчик базового класса уже доступен.
если Автоматический перезапуск Все еще относительно медленноиз,или Возникла проблема с загрузкой классов,Доступна техника перезарядки tryuse.,нравитьсяJRebel,Они переписывают класс при загрузке класса, чтобы получить более высокую скорость.
По умолчанию каждый раз Автоматический перезапускприложениеиз отобразит копию автоматической конфигурацияизотчет об изменениях(напримердобавить вилиудалитьbeanилинастраивать Конфигурациясвойство)
Отключить настройки отчетов:
spring.devtools.restart.log-condition-evaluation-delta=false
⚠️Примечание автора: Пример отчета при включении:
По умолчанию некоторые ресурсы не вызывают автоматический перезапуск при изменении. /META-INF/maven
, /META-INF/resources
, /resources
, /static
, /public
, /templates
в каталогеиз资源Нет会курок重启但да会курок[загрузка в реальном времени](#4.8.4 Загрузка в реальном времени),если Чтобы настроить эти исключения,Можетиспользоватьspring.devtools.restart.exclude
свойство,например Исключить только/static
и/public
Оглавление:
spring.devtools.restart.exclude=static/**,public/**
если Чтобы сохранить настройки по умолчанию,и добавлять новые из исключений,использоватьspring.devtools.restart.additional-exclude
。
если вы хотите отслеживать файлы, которых нет в пути к классам,использоватьspring.devtools.restart.additional-paths
свойство.Кроме того, вы можете Сотрудничатьspring.devtools.restart.exclude
来настраиватьдругой路径Внизиздокумент变更дакурок重启возвращатьсядазагрузка в реальном времени。
использоватьspring.devtools.restart.enabled
Отключить перезапуск,еслисуществоватьapplication.properties
Конфигурация,Перезапуск загрузчика классов все равно инициализирует его.,Он просто не будет отслеживать изменения файлов,хотеть完全禁用нуждатьсянастраиватьсистема变量spring.devtools.restart.enabled
дляfalse
,нравиться Вниз:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApplication.class, args);
}
}
Использовать конкретный из триггеров изменения файлов Автоматический перезапуск,использоватьspring.devtools.restart.trigger-file
Конфигурацияобозначениедокумент(Нет Сумкавключать路径),Файл должен находиться в пути к классам.
Например: проект с такой структурой:
src
+- main
+- resources
+- .reloadtrigger
Тогда конфигурация триггерного файла
spring.devtools.restart.trigger-file=.reloadtrigger
По умолчанию,Откройте проект в IDE и перезапустите загрузчик классов.,другой.jarдокументиспользовать基добрыйнагрузкаустройство。использоватьmvn spring-boot:run
илиgradle bootRun
То же самое。
МожетпроходитьMETA-INF/spring-devtools.properties
документотопределение,spring-devtools.properties
документ Сумка Содержитпрефиксдляrestart.exclude
иrestart.include
изсвойство,include
свойство被重启добрыйнагрузкаустройствонагрузка,exclude
свойство被基добрыйнагрузкаустройство排除,Этот атрибут применяется к пути к классам с нерегулярным выражением.,нравиться:
restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\\.]+\\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\\.]+\\.jar
Ключ должен быть единственным из,Пока это так
restart.exclude
иrestart.include
началоизсвойствогород被учитывать。META-INF/spring-devtools.properties
из内容Можетбить Сумкасерединапроектсередина,Вы также можете поиграть в библиотеку Сумкаприезжать.
дляиспользоватьстандартныйObjectInputStream
Десериализацияизобъект,Функция перезапуска не работает. если вам нужно десериализовать данные,но可能нуждаться ВоляSpringизConfigurableObjectInputStream
иThread.currentThread().getContextClassLoader()
объединитьиспользовать。
⚠️Примечание автора: думаю этот пункт можно пропустить
spring-boot-devtools
Сумка Содержитодин嵌入式изLiveReloadсервер,Доступный于资源变更час实часкурок Просматриватьустройство刷новый。LiveReload Просматриватьустройство扩展可отlivereload.com免费获得 Chrome、Firefox и Safari . если вы не хотите запускать приложение LiveReload сервер,ты Может Воля Долженspring.devtools.livereload.enabled
свойствоустановлен наfalse
.
Вы можете запускать только один раз LiveReload сервер. Перед запуском приложения убедитесь, что нет других LiveReload Сервер собственный. если вы из IDE Запустить несколько приложений, затем поддерживается только первое приложение. LiveReload。
⚠️Примечание автора: думаю этот пункт можно пропустить, обновить браузер вручную не составит труда🤪
Можетпроходить Воляк Внизлюбойдокументдобавить вприезжать$HOME/.config/spring-boot
Оглавление来Конфигурация全局 devtools настраивать:
spring-boot-devtools.properties
spring-boot-devtools.yaml
spring-boot-devtools.yml
Добавить проживание в этот файл. Любая конфигурация будет применяться ко всем Spring на этой машине. Boot приложение,Например,хотеть Воля Автоматический перезапуск Конфигурациядляиспользоватьтриггерный файл,Его можно настроить следующим образом:
spring.devtools.restart.trigger-file=.reloadtrigger
По умолчанию,$HOME
пользовательиз主Оглавление。хотеть自определение此Расположение,пожалуйстанастраиватьSPRING_DEVTOOLS_HOME
переменные средыилиspring.devtools.home
системасвойство.
еслисуществоватьHOME/.config/spring-bootсередина找Нетприезжать devtools конфигурационный файл, он будет в корнеHOMEОглавлениесередина搜索да否存существовать.spring-boot-devtools.propertiesдокумент。этотпозволятьтыи Нетподдерживать Должен
существовать
.spring-boot-devtools.properties
серединаиз Конфигурация都Нет会影响другойизприложение Конфигурациядокумент(нравитьсяapplication-{profile}
之добрыйиздокумент),А изменение Spring-boot-devtools-.propertiesspring.config.activate.on-profile не поддерживается.
FileSystemWatcherпроходитьдолженизчас间间разделенный轮询добрыйдокументизпереключиться на работу,Затем подождите заранее определенного периода молчания, чтобы гарантировать отсутствие дальнейших изменений. если вы обнаружите, что иногда некоторые изменения не меняются со временем,Можетпытаться修改spring.devtools.restart.poll-interval
иspring.devtools.restart.quiet-period
параметр。
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
Отслеживаемые каталоги путей к классам теперь опрашиваются на наличие изменений каждые 2 секунды с периодом молчания в 1 секунду, чтобы убедиться, что другие классы не изменились.
Spring Boot поддерживает частичную удаленную функцию,Но существуют определенные риски безопасности,Доступно только в доверенной сети или SSL-защите.,И эту функцию невозможно включить в производственной среде.
Чтобы включить эту функцию, убедитесь в следующей конфигурации:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
Затемиспользоватьspring.devtools.remote.secret
создать комплексизпароль。
Spring WebFlux не поддерживает эту функцию
удаленный клиентприложение旨существоватьотIDEсерединабегать。тынуждатьсяиспользоватьисоединятьприезжатьиз Удаленный проект - то же самоеиздобрый路径бегатьorg.springframework.boot.devtools.RemoteSpringApplication
。приложениеиз单个必需параметрдаэтосоединятьизудаленныйURL。
Например,еслитыиспользоватьиздаEclipseилиSTS,И приезжать Облако развернуто Foundryизпроектназванныйmy-app
,Тогда вы можете сделать следующее:
Run
菜单середина选择Run Configurations…
。Java Application
“запускать Конфигурация”。my-app
проект。org.springframework.boot.devtools.RemoteSpringApplication
作для主добрый。https://myapp.cfapps.io
добавить вприезжатьProgram arguments
(илилюбойудаленныйURL)。Устанавливаемый удаленный клиент может выглядеть следующим образом:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: (v2.7.8)
2023-01-19 14:18:32.205 INFO 16947 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication v2.7.8 using Java 1.8.0_362 on myhost with PID 16947 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/2.7.8/spring-boot-devtools-2.7.8.jar started by myuser in /opt/apps/)
2023-01-19 14:18:32.211 INFO 16947 --- [ main] o.s.b.devtools.RemoteSpringApplication : No active profile set, falling back to 1 default profile: "default"
2023-01-19 14:18:32.566 INFO 16947 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2023-01-19 14:18:32.584 INFO 16947 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.804 seconds (JVM running for 1.204)
Потому что удаленный клиент использует реальное приложение из пути к классам.,所кэто Может直接读取приложениесвойство.этотда
spring.devtools.remote.secret
свойствоиз读取方式иперешел ксервер进行身份проверять。始终предположениеиспользовать
https://
作длясоединять协议,чтобы соединение было зашифровано и пароли не перехватывались. если нужно использовать прокси для доступа к удаленному приложению,пожалуйста Конфигурацияspring.devtools.remote.proxy.host
иspring.devtools.remote.proxy.port
свойство.
Удаленный клиент выходит из строя при [локальном перезапуске] (#4.8.3 Автоматический перезапуск) так же, как и мониторинг пути к классам приложения на предмет изменений. 。любой更новыйиз Ресурсы будут перенаправленыприезжатьудаленныйприложение,и(еслинужно)会курок重новыйзапускать。еслиты迭代использоватьместный没有изоблачные сервисыиз Функция,Эта Воля очень полезна. в целом,Удаленное обновления Перезагрузка происходит намного быстрее, чем полная перестройка и развертывание в течение недели.
Отслеживайте файлы только во время работы удаленного клиента. Если вы измените файл до запуска удаленного клиента, он не будет отправлен на удаленный сервер.
⚠️Примечание автора: Для текущего крупномасштабного кластера микросервисов это нецелесообразно, и операция является громоздкой. Этот метод обновления может не действовать для некоторых классов. Лучше повторно развернуть Jenkins.
использоватьMaven илиGradle Упакуйте приложение и создайте файл пакета jar.
SpringApplication
поставлятьполучил одинmain()
Простой в использовании методSpring приложениезапускать,и делегировать статический методSpringApplication.run
。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
После запуска,буду читатьприезжатьнравиться Внизинформация:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.8)
2023-01-19 14:18:33.375 INFO 17059 --- [ main] o.s.b.d.f.s.MyApplication : Starting MyApplication using Java 1.8.0_362 on myhost with PID 17059 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2023-01-19 14:18:33.379 INFO 17059 --- [ main] o.s.b.d.f.s.MyApplication : No active profile set, falling back to 1 default profile: "default"
2023-01-19 14:18:34.288 INFO 17059 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-01-19 14:18:34.301 INFO 17059 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-01-19 14:18:34.301 INFO 17059 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71]
2023-01-19 14:18:34.371 INFO 17059 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-01-19 14:18:34.371 INFO 17059 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 943 ms
2023-01-19 14:18:34.754 INFO 17059 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-01-19 14:18:34.769 INFO 17059 --- [ main] o.s.b.d.f.s.MyApplication : Started MyApplication in 1.789 seconds (JVM running for 2.169)
По умолчаниюбревноуровеньдаINFO
,еслинужнодополнительныйизбревноуровеньнастраивать,Посмотреть[5.4.5 Уровень журнала](#5.4.5 уровень журнала).проходитьspring.main.log-startup-info
установлен наfalse
,приложениеиз логирования можно отключить.
еслиприложение Запуск не удался,можетпроходить ЗарегистрированизFailureAnalyzers
Получите информацию об ошибке, чтобы вы могли решить проблему.。напримерприложениезапускатьиз8080Порт занят。
***************************
APPLICATION FAILED TO START
***************************
Description:
Embedded servlet container failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that is listening on port 8080 or configure this application to listen on another port.
Spring Boot поддерживать自определение
Реализация Failanalyzer
Если нет ошибок, синтаксический анализатор точек способен обрабатывать исключения,тынуждаться给org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
[давать возможностьdebug
свойство](#5.2 внешняя конфигурации) или [открыть журнал отладки] (#5.4.5 уровень журнала).
использоватьjava -jar
запускатьприложение,использоватьdebug
включатьбревно:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
SpringApplication допускает отложенную инициализацию приложений. Если включена отложенная инициализация, компоненты создаются при необходимости, а не во время запуска.
Одним из недостатков ленивой инициализации является задержка обнаружения проблем приложения. Если неправильно настроенный компонент инициализируется лениво, сбой не произойдет во время запуска, и проблема будет обнаружена только при инициализации компонента. Также позаботьтесь о том, чтобы у JVM было достаточно памяти для размещения всех компонентов. Поэтому рекомендуется точно настроить размер кучи JVM, прежде чем включать отложенную инициализацию.
использоватьSpringApplicationBuilder
изlazyInitialization
илиSpringApplication
изsetLazyInitialization
методвключать Ленивая инициализация,также Можетиспользоватьspring.main.lazy-initialization
включать。
spring.main.lazy-initialization=true
Укажите ленивую инициализацию определенных bean-компонентов,использовать
@Lazy(false)
проходить Воляbanner.txt
добавить вприезжатьдобрый路径середина,илинастраиватьspring.banner.location
для Должендобрыйдокументиз Расположение,изменить печать баннера при запуске приложения.
если кодировка файла не UTF-8,Можетнастраиватьspring.banner.charset
。
Кроме сипользовать текстовые файлы,Также доступноиспользование фотографий,Фотография Воля добавлена в путь к классам приезжать,илинастраиватьspring.banner.image.location
,Графика Воля Конвертируется в формат ASCII.
существоватьbanner.txt
документсередина,ты МожетиспользоватьEnvironment
середина Доступныйизлюбой ключик Вниззаполнитель。
заполнитель | описывать |
---|---|
${application.version} | Ваш номер,нравитьсясуществоватьMANIFEST.MFзаявлениеизтаким образом。Например,Implementation-Version: 1.0 печатается как 1.0. |
${application.formatted-version} | Ваш номер,Объявлен в MANIFEST.MF и отформатирован для отображения (заключен в скобки, перед ним стоит префикс v (v1.0). |
${spring-boot.version} | Вы ищетеиспользованиеиз Spring Boot Версия。Например2.7.8。 |
${spring-boot.formatted-version} | Вы ищетеиспользованиеиз Spring Boot Версия, отформатированная для отображения (заключена в квадратные скобки и заканчивается имеет префикс v). Например (v2.7.8). |
${Ansi.NAME}(или${AnsiColor.NAME},,${AnsiBackground.NAME})${AnsiStyle.NAME} | NAMEANSI Где escape-код имяя. Подробности см. в AnsiPropertySource. |
${application.title} | Название вашего приложения, как указано в MANIFEST.MF. Например, Implementation-Title: MyApp печатается как MyApp. |
использовать
SpringApplication.setBanner(…)
к编程方式настраивать横幅,использоватьorg.springframework.boot.Banner
Интерфейс и реализацияprintBanner()
метод自определениебить印横幅。
Можетиспользоватьspring.main.banner-mode
настраиватьда否существоватьSystem.out
( console
)、или Распечатать баннер в файле журнала.、или Не печатать баннер
{application.version}и{application.formatted-version}КонфигурациятолькотолькосуществоватьиспользоватьSpring Загрузочный лаунчер доступен в любое время. еслитыиспользовать Нетбить Сумкаизжарить и использовать Java -cp <classpath> <mainclass>запускать,но Нет会生效。 Вот почему мы рекомендуем вам всегда использовать Java org.springframework.boot.loader.JarLauncherзапускать未бить Сумкаизjar。этот Волясуществоватьстроитьдобрый路径изапускатьприложение До初始化
application.*banner
переменная.
Если SpringApplication по умолчанию вас не устраивает, вы можете создать собственный экземпляр и настроить его. Например, чтобы отключить баннер:
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
}
}
также Можетиспользоватьapplication.properties
КонфигурацияSpringApplication
,Подробно посмотреть [Внешняя конфигурация](#5.2 внешняя конфигурация)
еслитынуждатьсястроитьApplicationContext
Иерархия(Иметь отношения между родителями и детьмииз Нескольконачальство Вниз文)илипредпочитатьиспользоватьпотоковая передачаAPIстроитьустройство,МожетиспользоватьSpringApplicationBuilder
。
SpringApplicationBuilder
让ты Воля Несколько вызовов цепочки методов,Сумкавключатьparent
иchild
Метод создания иерархической структуры,например:
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
ApplicationContext
创建Иерархия Есть некоторые ограничения. Например, Веб компонентыдолженСумка Содержитсуществовать子начальство Вниз文середина,итакой жеEnvironment
используется для父начальство Вниз文и子начальство Вниз文。有关Подробности,пожалуйста参阅SpringApplicationBuilder
Javadoc。
При развертывании на платформе,приложение МожетиспользоватьKubernetes Probeи другая инфраструктура предоставляют платформе информацию о своей доступностиизинформация。
Spring Boot к обычно используемому «живости» и Состояние «готовность» обеспечивает готовую поддержку. еслитыиспользовать Spring Boot изactuator
Таксостояние Волядля мониторинга конечных точекизпредоставленная форма。
кроме того,тывозвращаться МожетпроходитьApplicationAvailability
интерфейс Воля Доступностьсостояниеинъекцияприезжать Собственныйизbeanсередина。
приложениеиз Состояние «Живость» указывает, правильно ли оно работает,или в настоящее время является сбоемсостояние,Оно восстановится само. Прерывание состояния «Жизненность» означает, что приложение находится в неисправимом состоянии.,Затем инфраструктуру следует перезапустить.
Состояние «жизнеспособности» не должно основываться на внешних соображениях, например, на размышлениях о здоровье. Таким образом, сбой внешней информации (например, баз данных, внешних кэшей и т. д.) воля приводит к масштабному перезапуску из-за каскадных сбоев всей платформы.
Spring Boot Внутреннее состояние приложения в основном основано на Spring. из ApplicationContext
。еслиприложениеначальство Вниз文становиться功запускать,ноSpring Boot приложение будет считаться активным состояние, обновление контекста из слов, приложение считается активным, дополнительная ссылка [5.1.7 События приложения и прослушиватели](#5.1.7 События приложения и прослушиватели)
Состояние «Готовность» указывает, готово ли приложение обработать запрос. Сбой в состоянии «Готовность» означает, что в данный момент трафик не должен поступать. Обычно это происходит во время запуска,同час处理CommandLineRunner
иApplicationRunner
компоненты,Или Это происходит, когда приложение думает, что он слишком занят. После вызова приложения из командной строки приложение,Это считается «Статус помощи».
预Ожидатьсуществоватьзапускать Ожидать间бегатьиз Задача应Должен Зависит откомпоненты
CommandLineRunner
иApplicationRunner
осуществлять,Не использовать обратный вызов жизненного цикла компонента Spring,Например@PostConstruct
приложение Доступный随часпроходитьинъекцияApplicationAvailability
интерфейс и вызвать его методы, чтобы получить состояние его доступности. Существует также ситуация, когда приложение желает отслеживать обновления состояния или обновления приложенияизсостояния.
Например,Мы можем Воляприложениеиз состояния «Готовность» экспортировать приезжать в файл.,так что Kubernetes "exec Зонд» для просмотра файла:
import org.springframework.boot.availability.AvailabilityChangeEvent;
import org.springframework.boot.availability.ReadinessState;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MyReadinessStateExporter {
@EventListener
public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) {
switch (event.getState()) {
case ACCEPTING_TRAFFIC:
// create file /tmp/healthy
break;
case REFUSING_TRAFFIC:
// remove file /tmp/healthy
break;
}
}
}
Если приложение прервано и не может быть восстановлено, это приложение также можно обновить.
import org.springframework.boot.availability.AvailabilityChangeEvent;
import org.springframework.boot.availability.LivenessState;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class MyLocalCacheVerifier {
private final ApplicationEventPublisher eventPublisher;
public MyLocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void checkLocalCache() {
try {
// ...
}
catch (CacheCompletelyBrokenException ex) {
AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
}
}
}
Spring Boot Предоставление [Kubernetes HTTP-интерфейс](#11.2.9 Kubernetes Зонды) для привода Конечная точка здоровья из «Жизнеспособность» and В статусе «Готовность» вы можете получить дополнительные рекомендации по [развертыванию приложений в Kubernetes](#12.1.2 Kubernetes)。
Кроме весны События за пределами Framework,напримерContextRefreshedEvent
,SpringApplication Также будут отправлены некоторые дополнительные события.
有些событие实际начальстводасуществовать创建
ApplicationContext
创建До,поэтомуты Нет能作для@Bean
зарегистрироваться监听устройство。тыможетпроходитьSpringApplication.addListeners(…)
методилиSpringApplicationBuilder.listeners(…)
зарегистрироваться。 еслинадеяться自动зарегистрироватьсяэтот些监听устройство,Может Воля监听устройстводобавить вприезжатьMETA-INF/spring.factories
середина,использоватьorg.springframework.context.ApplicationListener
做дляkey。
планприложенияиз времени, события отправляются в следующем порядке:
ApplicationStartingEvent
Отправляется, когда приложение запускает проект (перед любой обработкой), за исключением случаев, когда зарегистрирован прослушиватель и инициализатор.ApplicationEnvironmentPreparedEvent
отправлять,когданачальство Вниз文серединахотетьиспользоватьизизвестныйEnvironment
час但существовать创建начальство Вниз文До。ApplicationContextInitializedEvent
отправлять,существовать准备ПонятноApplicationContext
ивызов ПонятноApplicationContextInitializers
назад,Но прежде чем загружать бобыApplicationPreparedEvent
существовать刷новыйначинать До,Но отправляется после загрузки определения компонентаApplicationStartedEvent
существовать刷новыйначальство Вниз文之назад,Но отправляется до вызова любой программы командной строки приложения.AvailabilityChangeEvent
существоватьвыражатьприложениесостояниедляLivenessState.CORRECT
часотправлятьApplicationReadyEvent
существоватьлюбойприложениеи Заказ行程序被вызов之назадотправлятьAvailabilityChangeEvent
существоватьвыражатьприложение已经做好接收пожалуйста求准备часотправлять,состояниедляReadinessState.ACCEPTING_TRAFFIC
ApplicationFailedEvent
существоватьзапускатьаномальныйчасотправлятьначальство面из Только список СумкавключатьиSpringApplication
СвязанныйизSpringApplicationEvent
событие。к ВнизсобытиетакжесуществоватьApplicationPreparedEvent
之назадиApplicationStartedEvent
Доотправлять。
WebServerInitializedEvent
существоватьWebServer
准备好назадотправлять,ServletWebServerInitializedEvent
иReactiveWebServerInitializedEvent
точка别даservlet и reactiveиз ВариантыContextRefreshedEvent
существоватьApplicationContext
刷новыйназадотправлятьПрослушиватели событий не должны выполнять длительные задачи, поскольку по умолчанию они находятся в одном потоке.
приложениесобытиеиспользоватьSpring Frameworkизсобытие发布机制отправлять。Этот механизмиз Часть перваяточка确保существовать子начальство Вниз文середина发布给监听устройствоизсобытиетакже会существоватьлюбой祖先начальство Вниз文середина发布给监听устройство。поэтому,еслитыизприложениеиспользоватьSpringApplication
Примериз Иерархия,Прослушиватель может получать несколько экземпляров событий одного и того же типа.
Чтобы позволить слушателю зонировать свой контекст и события, контекст потомка и события.,Он должен запросить внедрение контекста приложения.,Затем Воляинъекцияизначальство Вниз文исобытиеизначальство Вниз文进行比较。МожетпроходитьвыполнитьApplicationContextAware
илиесли监听устройстводаbean,использовать@Autowired
来инъекцияначальство Вниз文。
SpringApplication会试картина创建正确добрый型изApplicationContext。используется для определенияWebApplicationTypeизалгоритмнравиться Вниз:
AnnotationConfigServletWebServerApplicationContext
AnnotationConfigReactiveWebServerApplicationContext
AnnotationConfigApplicationContext
этот意味着еслитыWebClient
существовать同一приложениесерединаиспользовать Spring MVC и Spring WebFlux , то по умолчанию Воляиспользовать Spring MVC。ты МожетпроходитьвызовsetWebApplicationType(WebApplicationType)
покрыть。
также Может完全控制ApplicationContext
вызов所использоватьиздобрый型setApplicationContextClass(…)
。
существоватьJUnit测试серединаиспользовать
SpringApplication
час,в целомнуждатьсявызовsetWebApplicationType(WebApplicationType.NONE)
еслитынуждатьсядоступперешел кSpringApplication.run(…)
изприложениепараметр,но Можетинъекцияorg.springframework.boot.ApplicationArguments
bean。ApplicationArguments
интерфейспоставлятьверно原始String[]
параметра также解析изoption
иnon-option
параметриздоступ,нравитьсяк Вниз Пример所示:
import java.util.List;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
public MyBean(ApplicationArguments args) {
boolean debug = args.containsOption("debug");
List<String> files = args.getNonOptionArgs();
if (debug) {
System.out.println(files);
}
// if run with "--debug logfile.txt" prints ["logfile.txt"]
}
}
Spring Bootвозвращатьсязарегистрироваться
CommandLinePropertySource
иSpringEnvironment
。этот使тывозвращаться Можетиспользовать@Value
Комментарийинъекция单个приложениепараметр。
еслитынуждатьсясуществовать После запускабегатьнекоторые конкретныеизкодSpringApplication
,ты МожетвыполнитьApplicationRunner
илиCommandLineRunner
интерфейс。этот两个интерфейсктакой жеизспособ работы,и предоставитьrun
метод,ДолженметодсуществоватьSpringApplication.run(…)
完становиться До被вызов。
Идеально подходит для задач планирования после запуска приложения, но до того, как запрос будет принят.
этот些CommandLineRunner
интерфейспоставлятьнить数组используется длядоступверноприложениепараметр,иApplicationRunner
использоватьApplicationArguments
。к Вниз Пример显示ПонятноCommandLineRunner
одинrun
метод:
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) {
// Do something...
}
}
Если компонент CommandLineRunner или ApplicationRunner вызывается последовательно,Можетвыполнитьorg.springframework.core.Ordered
интерфейсилииспользоватьorg.springframework.core.annotation.Order
аннотация,
каждыйSpringApplication
向 JVM зарегистрироватьсяодин关闭钩子,чтобы обеспечитьApplicationContext
существовать退出час正常关闭。Можетиспользоватьвсестандартныйиз Spring жизньнеделяобратный вызов периода(НапримерDisposableBean
интерфейсили@PreDestroy
Комментарий)。
также,еслинадеятьсясуществоватьSpringApplication.exit()
被вызовчасвозвращатьсяидентификацияиз退出код,но Можетвыполнить Долженинтерфейсorg.springframework.boot.ExitCodeGenerator
,Затем Может Воля此退出кодперешел кSystem.exit()
Что Воля作длясостояниевозврат кода,нравитьсяк Вниз Пример所示:
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MyApplication {
@Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
}
public static void main(String[] args) {
System.exit(SpringApplication.exit(SpringApplication.run(MyApplication.class, args)));
}
}
также,ExitCodeGenerator
интерфейс Можетпроходитьаномальный来выполнить。сталкиватьсяприезжать此добрыйаномальныйчас,Spring Boot 会возвращаться已выполнитьgetExitCode()
методпоставлятьиз退出код。
если существует НесколькоExitCodeGenerator
,thenuse генерирует изпервый ненулевой код выхода. Чтобы контролировать порядок вызова генераторов,пожалуйстакроме тоговыполнитьorg.springframework.core.Ordered
интерфейсилииспользоватьorg.springfframework.core.annotation.order
аннотация。
Можетпроходитьобозначениеspring.application.admin.enabled
свойстводляприложениедавать возможностьи管理Связанныйиз Функция。этот暴露ПонятноSpringApplicationAdminMXBean
平台начальствоизMBeanServer
。ты Можетиспользовать此Функцияудаленный管理тыиз Spring Boot Приложение Эта функция также доступна для реализации любого сервиса Сумка-загрузчик.
Если вы хотите знать, где находится приложение HTTP 端口начальствобегать,Получать
local.server.port
свойствоизценить。
Во время запуска приложения,SpringApplication
осуществлятьApplicationContext
многоиприложениежизньнеделя Ожидать、bean жизньнеделя Ожидать甚至处理приложениесобытие Связанныйиз Задача。有ПонятноApplicationStartup
Spring Framework ,ты就МожетиспользоватьStartupStep
объекти踪приложениезапускатьзаказ。Может收集этот些数据используется дляточкаанализиз,или Просто чтобы лучше понять процесс запуска приложения.
МожетиспользоватьsetApplicationStartup
настраиватьодинвыполнитьApplicationStartup
из Пример,например,использоватьBufferingApplicationStartup
из Пример:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
}
}
первый ДоступныйизвыполнитьFlightRecorderApplicationStartup
Зависит от Spring Framework поставлять. это будет специфично для Spring добавлено событие isstart Java Flight Recorder сеанс, предназначенный для анализа приложения и Spring Жизненный цикл контекста и JVM событие(Напримерточкасоответствовать、GC、добрыйнагрузка……)Связанный联。Конфигурация完становитьсяназад,Вы можете записывать данные с включенным бортовым самописцем:
$ java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar demo.jar
Spring Boot 附带BufferingApplicationStartup
Варианты;此выполнить旨существовать缓冲запускать步骤и Воляони排入снаружиотделение指标система。BufferingApplicationStartup
приложение Можетсуществоватьлюбойкомпонентысерединапожалуйста求добрый型из bean 。
Spring Boot Его также можно настроить для предоставления JSON документпредоставленная форма此информацияизstartup
конечная точка。
Spring Boot Позволяет вам экспортировать вашу конфигурацию, чтобы вы могли использовать один и тот же код в разных средах. Вы можете использовать различные внешние источники конфигурации, в том числе Java Файл свойств, YAML Файлы, переменные среды и параметры командной строки。
Значения атрибутов можно вводить напрямую через аннотации. bean @Value
,проходить Spring изабстрактныйEnvironment
доступ,илипроходить@ConfigurationProperties
обязательностьприезжатьобъект。
Spring Boot использоватьочень особенныйизPropertySource
заказ,Разработано, чтобы обеспечить разумное переопределение значений. Позже источники атрибутов могут перезаписать ранее определенные значения. Источники рассматриваются в следующем порядке:
SpringApplication.setDefaultProperties
обозначение@Configuration
начальствоиз@PropertySource
аннотация,пожалуйста, обрати внимание,Прежде чем обновить контекст приложения,этот些свойство源Нет会добавить вприезжатьEnvironment
середина。иlogging.*
и spring.main.*
читается до обновления контекста приложения.application.properties
RandomValuePropertySource
серединатолькодляrandom.*
из Конфигурацияjava:comp/env
изJNDIсвойствоServletContext
初始化параметрServletConfig
初始化параметрSPRING_APPLICATION_JSON
изсвойство,嵌入существоватьпеременные среды(environment variable ) или свойства системы (система свойство) встроенное JSONproperties
,существовать@SpringBootTest
иДля тестирования приложения конкретного отдела точкаиз теста аннотацияначальство有效。@TestPropertySource
$HOME/.config/spring-boot
ОглавлениесерединаизDevtoolsГлобальные настройки КонфигурацияДанные конфигурацииизнагрузка按照к Вниззаказ:
application.properties
и Варианты YAMLapplication-{profile}.properties
и YAML Вариантыapplication.properties
и YAML Вариантыapplication-{profile}.properties
и YAML ВариантыРекомендуется использовать формат файла конфигурации, если он также имеет свойства и yaml, свойства имеют приоритет.
гипотезатыоткрыть发получил один@Component
использоватьname
свойствоизприложение,нравитьсяк Вниз Пример所示:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
существоватьтыизприложениедобрый路径середина(Например,в твоей банке),ты Может有одинapplication.properties
документдляname
. существоватьновый环境серединабегатьчас,application.properties
Можетсуществовать jar 之снаружипоставлятьодиндокументпокрытьname
. для一次性测试,ты Можетиспользоватьидентификацияиз Заказ行открыть关(Например,java -jar app.jar --name="Spring"
)запускать。
Конечная точка envиconfigprops может использоваться для определения того, почему свойство имеет определенное значение. Эти две конечные точки можно использовать для диагностики неожиданных значений атрибутов. Для получения дополнительной информации,пожалуйста参阅"Production ready features"отделениеточка。
По умолчанию,SpringApplication
Волялюбой Заказ行选элементпараметр(То есть --
началоизпараметр,Например--server.port=9000
)Конвертироватьдляproperty
и Воляонидобавить вприезжать SpringEnvironment
середина,Свойства командной строки всегда имеют приоритет над источниками свойств на основе файлов.
если Вы не хотите, чтобы свойства командной строки Воля добавлялись приезжать серединаEnvironment
,ты МожетиспользоватьSpringApplication.setAddCommandLineProperties(false)
отключить их。
Переменные среды и системные свойства обычно имеют ограничения.,Это означает, что некоторые атрибуты имя нельзя использовать. Чтобы решить эту проблему,Spring Boot Позволяет закодировать блок свойств в один JSON структура.
Когда вы начнете,любойspring.application.json
илиSPRING_APPLICATION_JSON
свойство Воля被解析идобавить вприезжатьEnvironment
.
Например,SPRING_APPLICATION_JSON
Можетсуществовать UN*X shell Атрибут Воля предоставляется как переменная среды в командной строке:
$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar
В предыдущем примере вы оказались в Spring изEnvironment
середина Получатьmy.name=test
。
такой жеиз JSON Также может быть предоставлено как системное свойство:
$ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar
или вы можете использовать параметры командной предоставлено строкой JSON:
$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'
если развернуть приезжать классический сервер приложений,тывозвращаться Можетиспользоватьназванныйjava:comp/env/spring.application.json
изJNDI переменная.
Несмотря на то, что изнул Воля добавляется в источник свойства результата в формате JSON, PropertySourcesPropertyResolver рассматривает атрибут Волянул как отсутствующий из значения. Это означает, что JSON не может перезаписать свойства с низким приоритетом в источнике нулевыми значениями.
Когда вы начнете,Spring Boot Воля自动отк Вниз Расположение Находитьинагрузкаapplication.properties
иapplication.yaml
этот个列表按заказ排列(нижеизэлементы будут перезаписаны ранееизэлемент)。нагрузкаиздокумент会做дляPropertySources
добавить вприезжатьSpring Environment
середина。
еслиты Нет想用application
作для Конфигурациядокумент名,ты Можетпроходитьобозначениеодинspring.config.name
环境свойство来切换приезжать另одиндокумент名。Например,хотеть Находитьmyproject.properties
иmyproject.yaml
документ,ты Может按нравиться Вниз方式бегатьтыизприложение:
$ java -jar myproject.jar --spring.config.name=myproject
тывозвращаться Можетиспользоватьspring.config.location
环境свойство来Цитировать显式Расположение。此свойство接受одинили Несколькохотетьисследоватьиз Расположениеиззапятаяточкаразделенный список。
к Вниз Пример显示нравиться何обозначение两个Нет同издокумент:
$ java -jar myproject.jar --spring.config.location=\
optional:classpath:/default.properties,\
optional:classpath:/override.properties
optional
Префикс указывает,Местоположение не является обязательным.,разрешено не существовать
spring.config.name
,spring.config.location
, иspring.config.additional-location
很早就используется для определениядолженнагрузка哪些документ。онидолженопределениедля环境свойство(в целомда Переменные среды операционной система, системный атрибут или параметр командной строки)。
еслиspring.config.location
Сумка Содержит Оглавление(и Нетдадокумент),应Долженк/
окончание。существоватьбегатьчас,они Волясуществоватьнагрузка До附加отspring.config.name
генерироватьизимя
Также используется позиционирование каталогов и файлов. исследовать файл, указанный в профиле。Например,если
spring.config.location
Конфигурациядляclasspath:myconfig.properties
,classpath:myconfig-<profile>.properties
издокументтакже会被нагрузка
в большинстве случаев,spring.config.location
тыдобавить виз每个проект都Воля Цитироватьодиндокументили Оглавление。Расположение按照они被определениеиззаказ处理,Следующее из может перезаписать предыдущее значение.
если у вас есть комплекс из локации для установки,И youruseprofile указывает из профиля,Тогда вам, возможно, потребуется дать дополнительные советы.,так чтоSpring Бут знает, как их следует сгруппировать. группа местоположений — это совокупность всех позиций, считающихся находящимися на одном уровне. Например, вы можете сгруппировать по точкам все местоположения пути к классам, а затем сгруппировать по точкам все внешние местоположения. группа местоположенийсерединаизпроект用;
точкаразделенный,详细ПроверятьProfile Specific Files
использоватьspring.config.location
заменить по умолчаниюиз Расположение Конфигурация。Например,еслиspring.config.location
установлен наoptional:classpath:/custom-config/,optional:file:./custom-config/
,Тогда полный набор позиций равен:
optional:classpath:custom-config/
optional:file:./custom-config/
если вы предпочитаете добавить другое местоположение,вместо того, чтобы заменить их,ты Можетиспользоватьspring.config.additional-location
. Загрузка свойств из других мест может переопределить значение по умолчанию.
Например,еслиspring.config.additional-location
Конфигурация Понятноценитьoptional:classpath:/custom-config/,optional:file:./custom-config/
,Тогда учтите, что полный набор позиций:
optional:classpath:/;optional:classpath:/config/
optional:file:./;optional:file:./config/;optional:file:./config/*/
optional:classpath:custom-config/
optional:file:./custom-config/
Такой порядок поиска позволяет указать значение в одном файле конфигурации. по умолчанию,Затемсуществовать另один Конфигурациядокументсередина有选择地крышкаэтот些ценить。ты Можетсуществоватьпо умолчанию Расположение之一изapplication.properties
(илиты选择излюбойдругой基本имяspring.config.name
)серединадлятыизприложениепоставлятьзначение по дефолт. Затем это значение можно перезаписать другими файлами, если проект находится в одном из пользовательских расположений. по умолчанию。
если вы используете переменные среды вместо системных свойств,Большинство операционных систем не позволяют использовать точку для разделения имен ключей.,但ты Можетиспользовать Вниз划线заменять(Например,
SPRING_CONFIG_NAME
заменятьspring.config.name
)。有关Подробности,пожалуйста参阅Привязка из переменных среды。еслитыизприложениесуществовать servlet контейнерилиприложениесерверсерединабегать,но Можетиспользовать JNDI свойство(существовать
java:comp/env
середина)или servlet Параметры инициализации контекста вместо использования переменных среды или системного свойства.
По умолчанию,Если указанное расположение данных конфигурации не существует,Spring Boot Воля БросатьConfigDataLocationNotFoundException
,И приложение Воля остановилось.
еслинужнообозначениеодин Расположение,Но не должно существовать,использоватьoptional:
префикс。Можетсуществоватьspring.config.location
иspring.config.additional-location
а такжеspring.config.import
серединазаявление。
например,spring.config.import
свойство,ценитьдляoptional:file:./myconfig.properties
,Когда файл не существует,Приложение также можно активировать.
еслиты想хотеть忽略всеизConfigDataLocationNotFoundExceptions
аномальный,и всегда разрешать приложению продолжать загрузку,Можетиспользоватьspring.config.on-not-found
Конфигурация。илипроходитьSpringApplication.setDefaultProperties(…)
илииспользоватьсистема/переменные средынастраивать忽略изценить。
еслиодин Конфигурациядокумент Расположение路径наконец Сумка Содержит*
,Это означает, что это позиция подстановочного знака. Это в случае нескольких файлов конфигурации из,Очень полезно.
например,Есть несколько конфигураций Redis и конфигураций Mysql.,Возможно, вы захотите открыть эти два файла конфигурации.,但又существоватьapplication.properties
документсередина,Могут быть два разных пути,/config/redis/application.properties
и/config/mysql/application.properties
,проходитьconfig/*/
Может Воля两个Конфигурациядокумент都进行нагрузка。
По умолчанию весна Bootсуществоватьпо умолчанию搜索Расположение Сумка Содержитconfig/*/
,Это означает, что Воля ищет jar-файлы во всех подкаталогах за пределами каталога из/config.
ты Может Воля通соответствовать符иspring.config.location
иspring.config.additional-location
Вместеиспользовать。
Геотаргетинг с использованием подстановочных знаковможет только Сумка Содержитодин
*
,для搜索Оглавлениедолженк*/
окончание,Для поиска файлов,нодолженк*/<filename>
окончание。с通соответствовать符из Расположениекорень据документ名из绝верно路径按字母заказ排序。通соответствовать符Расположениетолько Применимо кснаружиотделение Оглавление。Нет能существовать
classpath:location
серединаиспользовать通соответствовать符。
除Понятноapplication
свойстводокумент之снаружи,Spring Bootвозвращаться Воляпытатьсяиспользоватьсоглашение об именахapplication-{profile}
нагрузкаprofileидентификациядокумент。Например,еслиприложениеактивацияназванныйprod
из КонфигурациядокументииспользоватьYAML-файлы,Так Воля同часнагрузкаapplication.yml
иapplication-prod.yml
。
Файлы, специфичные для Загрузка атрибутов профиля и стандартная загрузка атрибутов приложения из местоположения одинакова, файл, специфичный для профиля, всегда перезаписывает неспецифический файл (application.yml). Если указано несколько файлов конфигурации, будет использоваться последняя выигрышная стратегия. Например, если файл конфигурации prod
、live
да Зависит отspring.profiles.active
свойствообозначениеиз,Такapplication-prod.properties
серединаизценить Может被application-live.properties
серединаизценитькрышка。
наконец获胜策略Применимо кгруппа местоположенийуровень。spring.config.location
изclasspath:/cfg/,classpath:/ext/
Конфигурацияиclasspath:/cfg/;classpath:/ext/
Конфигурацияизкрышка规но Нет同。
Например,Продолжить приведенные выше примеры изпрода и live,У нас могут быть следующие файлы:
/cfg
application-live.properties
/ext
application-live.properties
application-prod.properties
spring.config.location
изценитьдляclasspath:/cfg/,classpath:/ext/
,Программа сначала обработает его./cfg
Внизизвседокумент,перерабатывать/ext
/cfg/application-live.properties
/ext/application-prod.properties
/ext/application-live.properties
еслиценитьдляclasspath:/cfg/;classpath:/ext/
,Программы рассматриваются как один уровень
/ext/application-prod.properties
/cfg/application-live.properties
/ext/application-live.properties
Environment
有一组по умолчанию Конфигурациядокумент(По умолчаниюдля[default]),если Активный профиль не установлен,Затем используйте эти профили. другими словами,если нет явного профиля активации,Так Воляучитыватьapplication-default
。
Конфигурациядокумент只нагрузка一次。еслиты已经Прямой импортПонятноконкретный файл свойств профиля, файл не будет импортирован повторно.
приложение Конфигурация Можетиспользоватьspring.config.import
Свойства импортируют больше данных конфигурации из других мест.
Например, путь к классам application.properties
документсередина可能Сумка Содержитк Вниз内容:
spring.application.name=myapp
spring.config.import=optional:file:./dev.properties
Это Воля триггер текущий импорт файла каталога dev.properties (если существуетэтот样издокумент)。импортироватьизdev.properties
серединаизценить Воля优先于курокимпортироватьиздокумент。В приведенном выше примере,dev.properties
Может Воляspring.application.name
重новыйопределениедля Нет同изценить。
Сколько бы раз это ни объявлялось,Их можно импортировать только один раз. Порядок отдельных документов, определенный в файле свойств импорта/yamliz, не имеет значения.,например,Следующие два примера дают одинаковые результаты.
spring.config.import=my.properties
my.property=value
my.property=value
spring.config.import=my.properties
В двух приведенных выше примерах,my.properties
документсерединаизценить Воля优先于курок Чтоимпортироватьиздокумент。Можетсуществоватьодинspring.config.import
Внизобозначение Несколько Расположение,Позиции Воля обрабатываются в порядке, определенном из,Импорт конфигурации будет иметь приоритет в будущем.
Когда это уместно, Также импортируется конкретный параметр профилирования.,начальство面из Пример Воляимпортировать
my.properties
а такжелюбойmy-<profile>.properties
Варианты。Spring BootСумка включает подключаемый API,Позволяет поддерживать различные адреса местоположений. По умолчанию,ты МожетимпортироватьJavaКонфигурация、YAMLи“Дерево конфигурации”。 Сторонние jar-файлы могут обеспечивать поддержку других технологий (файлы не обязательно должны быть локальными). Например, вы можете представить данные конфигурации, поступающие от Consul, Apache ZooKeeper — Netflix Внешнее хранилище, такое как Archaius. еслихотетьподдерживать自определение Расположение,пожалуйста参阅
org.springframework.boot.context.config
СумкасерединаизConfigDataLocationResolver
иConfigDataLoader
добрый。
Некоторые облачные платформы не могут добавлять расширения файлов к файлам монтирования тома. Чтобы импортировать эти файлы без расширений, вам нужно предоставить Spring поместив расширенную подсказку в квадратные скобки.
Например,гипотезаты有один/etc/config/myconfig
документ,надеяться Воля Что作дляyamlимпортировать。ты Можетиспользовать Следующая командаотapplication.properties
импортироватьэто:
spring.config.import=file:/etc/config/myconfig[.yaml]
существовать云平台(нравитьсяKubernetes)начальствобегатьприложениечас,Обычно необходимо прочитать значения конфигурации, предоставленные платформой. Для этой цели нередко используются переменные среды.,Но это может иметь недостатки,В частности, значение должно оставаться конфиденциальным.
В качестве альтернативной переменной окружения,много云平台现существоватьпозволятьты Воля Конфигурация映射приезжатьнагрузкаиз数据卷середина。Например,KubernetesМожет卷нагрузкаConfigMapsиSecrets。
Доступны два распространенных режима монтажа тома:
Для первого случая,МожетВышеуказанная конфигурацияиспользоватьspring.config.import
импортироватьYAMLилиPropertiesдокумент。
Для второго случая,тынуждатьсяиспользоватьconfigtree:
префикс,так чтоSpring Boot знает, что ему необходимо предоставить все файлы как свойства.
Например,Предположим, что Kubernetes Установить имеет следующие тома:
etc/
config/
myapp/
username
password
username
даодин Конфигурацияизценить,password
даодин加密нить
Чтобы импортировать эти конфигурации,ты Может Волянравиться Вниз内容импортироватьapplication.properties
илиapplication.yaml
spring.config.import=optional:configtree:/etc/config/
Затем,ты Может用в целомиз方式отEnvironment
серединадоступилиинъекцияmyapp.username
иmyapp.password
свойство.
📌 Дерево конфигурации Внизиздокумент夹构становитьсясвойствоимя。В приведенном выше примере,хотетьк
username
иpassword
изформадоступсвойство,Может Воляspring.config.import
установлен наoptional:configtree:/etc/config/myapp
。с точечной записьюиздокумент名также正确映射。Например,В приведенном выше примере,
/etc/config
серединаназванныйmyapp.username
издокумент ВолясуществоватьEnvironment
серединагенерироватьmyapp.username
свойство.📌 Дерево конфигурацииценить Можетобязательностьприезжатьнить
String
иbyte[]
добрый型,Это зависит от предполагаемого содержания.
если Чтобы импортировать несколько Деревьев из одной родительской папки конфигурации,но Можетиспользовать通соответствовать符快捷方式。любойк/*/
окончаниеизconfigtree:location
город Волявсе直接子级作для Дерево конфигурацииимпортировать。
etc/
config/
dbconfig/
db/
username
password
mqconfig/
mq/
username
password
ты Можетиспользоватьconfigtree:/etc/config/*/
作дляимпортировать Расположение:
spring.config.import=optional:configtree:/etc/config/*/
Вышеуказанная конфигурация будет импортирована. db.username
, db.password
, mq.username
и mq.password
свойство.
🚩использовать загрузку по подстановочным знакам из каталогов, отсортированных в алфавитном порядке. Если вам нужна другая сортировка, вам следует импортировать каждый столбец позиции отдельно из
Конфиденциальные данные. Когда сервису Docker Swarm разрешен доступ к конфиденциальным данным,Долженконфиденциальные данные被装入контейнерсередина。Например,еслиназванныйdb.password
изконфиденциальные данные Установитьсуществовать Расположение/run/secrets/
,но Можетиспользоватьк Вниз变量db.passwords
существоватьSpring环境середина:
spring.config.import=optional:configtree:/run/secrets/
Значение из в application.propertiesиapplication.yml будет фильтроваться по существующему изEnvironment, когда оно используется.,поэтомуты Может Цитироватьк前определениеизценить(Например,отсистемасвойствоилипеременные среды)。стандартныйиз{name}Заполнитель Синтаксис свойств может находиться в любом месте значения изиспользовать, Заполнитель свойствавозвращаться Можетиспользовать:обозначениезначение по умолчанию,Волязначение по умолчаниюисвойствоимяточкаоткрыть,Например{name:default}。
к Вниз Пример显示Понятно带значение по умолчаниюи Нет带значение по умолчаниюиззаполнительизиспользовать:
app.name=MyApp
app.description=${app.name} is a Spring Boot application written by ${username:Unknown}
Вы всегда должны ссылаться на использованиезаполнителя в канонической форме (кебаб-регистр использует только строчные буквы) в атрибуте имя. Эта Воля позволяет Весне Bootиспользоватьи
@ConfigurationProperties
такой жеизсвободный переплетлогика。 Например,{demo.item-price}Воля Получить demo.iterm-priceиdemo.itemPrice из файла application.properties,И получить DEMO_ITEMPRICE из системного окружения. если вместо этого использовать{demo.itemPrice},demo.item-price иDEMO_ITEMPRICE рассматриваться не будут.🚩Вы также можете создать существующие свойства SpringBoot с помощью этого метода, используя «короткие» варианты. Для получения дополнительной информации,пожалуйста参阅использовать«Короткие» параметры командной строкиизметод。
Spring Boot позволяет разделить один физический файл на несколько логических документов, при этом каждый логический документ добавляется независимо. Документы обрабатываются в порядке сверху вниз. Последующие документы могут перезаписывать конфигурации, определенные в более ранних документах.
дляapplication.yml
документ,используйте стандартный многодокументный синтаксис YAML. Три последовательных дефиса обозначают конец одного документа и начало следующего документа.
Например, следующее содержит два логических документа:
spring:
application:
name: "MyApp"
---
spring:
application:
name: "MyCloudApp"
config:
activate:
on-cloud-platform: "kubernetes"
application.properties
документиспользовать#---
или!---
разделить документ
spring.application.name=MyApp
#---
spring.application.name=MyCloudApp
spring.config.activate.on-cloud-platform=kubernetes
🚩 Разделители профилей не могут иметь ведущих пробелов и должны содержать ровно три дефиса.
📌 多документсвойстводокументв целомиактивация Конфигурация(нравиться
spring.config.activate.on-profile
)объединитьиспользовать。有关Подробности,См. следующий раздел。 Невозможно загрузить файл свойств нескольких документов.
У вас может быть конфигурация, которая подключается только тогда, когда активен определенный профиль.
ты Можетиспользоватьspring.config.activate.*
有条件地активация Конфигурациясвойство.
Доступны следующие конфигурации активации:
Property | Note |
---|---|
on-profile | необходимо соответствие, чтобы активировать документ из выражения профиля |
on-cloud-platform | Чтобы сделать документ активным, необходимо определить приезжать «CloudPlatform». |
Например,Второй документ, указанный ниже, действителен только при запуске в Kubernetes.,И действительно только в том случае, если профиль «prod» или «staging» активен:
myprop=always-set
#---
spring.config.activate.on-cloud-platform=kubernetes
spring.config.activate.on-profile=prod | staging
myotherprop=sometimes-set
Spring Boot не предоставляет никаких свойств шифрованияиз内置поддерживать,但этопоставлять Понятно修改Spring环境середина Сумка Содержитценить所需източка крючка。EnvironmentPostProcessor
позволятьтысуществоватьприложениезапускатьизчас候控制Environment
,Подробно ознакомьтесь с [Настраиваемые переменные среды при запуске] (#15. «Практическое руководство»).
если вам нужен безопасный способ хранения учетных данных и паролей,Spring Cloud Vaultпроект ВоляподдерживатьсуществоватьHashiCorp Vaultсередина存储Внешняя конфигурация。
YAMLдаJSONизсуперсет,Удобный формат для указания данных конфигурации точечного слоя. Пока библиотека SnakeYAML находится в пути к классам,SpringApplication
добрый Воля自动поддерживатьYAML作дляpropertiesиззаменять。
Документы YAML необходимо преобразовать из их иерархического формата, чтобы их можно было использовать в Spring. Environment
изплоскийструктура.
Например,нравиться ВнизизYAMLдокумент:
environments:
dev:
url: "https://dev.example.com"
name: "Developer Setup"
prod:
url: "https://another.example.com"
name: "My Cool App"
для ПонятноотEnvironment
серединадоступэтот些свойство,Их выравнивают следующим образом:
environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App
такой же,Списки YAML также необходимо сгладить.,использовать[index]
做дляключ,например Вниз面изYAML。
my:
servers:
- "dev.example.com"
- "another.example.com"
После преобразования приведенного выше примера в свойства:
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
использовать[index]
выражатьизpropertiesможетобязательностьприезжатьJavaизList
илиSet
объект。有关更多Подробности,См. ниже.
Невозможно загрузить файл YAML. Поэтому, если вам нужно загрузить значения таким способом, вам понадобится файл useproperties.
Spring Framework предоставляет два удобных класса.,Доступный于нагрузкаYAMLдокумент。YamlPropertiesFactoryBean
ВоляYAML作дляProperties
нагрузка,YamlMapFactoryBean
ВоляYAML作дляMap
нагрузка。
Если вы хотите использовать YAML как Spring PropertySource
нагрузка,также МожетиспользоватьYamlPropertySourceLoader
добрый。
RandomValuePropertySource
используется дляинъекция随机ценить(Например,Внедрить зашифрованные символы или тестовый пример). Он может генерировать целые, длинные, uuidилистроки,нравиться Внизпример所示:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number-less-than-ten=${random.int(10)}
my.number-in-range=${random.int[1024,65536]}
random.int*
语法даOPEN value (,max) CLOSE
,где ОТКРЫТО,ЗАКРЫТЬ — любой символ,значение, максимум — целые числа,если предлагает максимум,Тогда значение является минимальным значением,max — максимальное значение (не входит в комплект).
Spring Boot поддерживает установку префиксов для свойств среды. если системная среда состоит из нескольких Spring с разными требованиями к конфигурации. Bootприложениеподелиться,этот Воля Очень полезно.система环境свойствоизпрефикс Может直接существоватьSpringApplicationначальствонастраивать。
Например,если Воляпрефиксустановлен наinput
,но诸нравитьсяremote.timeout
之добрыйизсвойствотакже Волясуществоватьсистема环境середина解析дляinput.remote.timeout
。
использовать@Value("${property}")
инъекция Конфигурациясвойствоиногдабудет очень хлопотно,Особенно, если у вас есть несколько атрибутов и данных, которые по сути представляют собой слой данных. SpringBoot предоставляет еще один метод — использование свойств.,Этот метод позволяет управлять строго типизированными компонентами и проверять конфигурацию приложения.
Также проверьте @Value и type-safe configuration свойстваизразличия
Может обязательностьприезжать стандарт из JavaBean,нравиться Внизпример所示:
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("my.service")
public class MyProperties {
private boolean enabled;
private InetAddress remoteAddress;
private final Security security = new Security();
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public InetAddress getRemoteAddress() {
return this.remoteAddress;
}
public void setRemoteAddress(InetAddress remoteAddress) {
this.remoteAddress = remoteAddress;
}
public Security getSecurity() {
return this.security;
}
public static class Security {
private String username;
private String password;
private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public List<String> getRoles() {
return this.roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
}
}
Ранее изPOJO определял следующие атрибуты:
String
Картографирование приезжать Весна Класс @ConfigurationProperties, доступный в Boot, является общедоступным API. Эти классы представляют собой файлы свойств, файлы YAML, переменные среды и другие конфигурации механизмов, но сам класс издоступных геттеров/сеттеров не предназначен для прямого использования.
Такое расположение основано на пустом конструкторе по умолчанию, а методы получения и установки обычно являются обязательными, поскольку обязательность является стандартом для свойств JavaBeans, как и в Spring MVC. Сеттер можно опустить в следующих ситуациях:
Security
Передний Примерсерединаиз Поле),но Нетнуждаться сеттер. если вы хотите обязательно использовать его конструктор по умолчанию для динамического создания экземпляров, вам понадобится установщик.有些人использовать Project Lombok чтобы автоматически добавлять getter и сеттер. убеждаться Lombok Для таких типов не создается специальный конструктор, поскольку контейнер автоматически использует его для создания экземпляра объекта. Наконец, просто рассмотрим критерии Java Bean Свойство обязательность статического свойства не поддерживается.
Пример из предыдущего раздела можно переписать неизменяемым образом.,нравитьсяк Вниз Пример所示:
import java.net.InetAddress;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
@ConstructorBinding
@ConfigurationProperties("my.service")
public class MyProperties {
private final boolean enabled;
private final InetAddress remoteAddress;
private final Security security;
public MyProperties(boolean enabled, InetAddress remoteAddress, Security security) {
this.enabled = enabled;
this.remoteAddress = remoteAddress;
this.security = security;
}
public boolean isEnabled() {
return this.enabled;
}
public InetAddress getRemoteAddress() {
return this.remoteAddress;
}
public Security getSecurity() {
return this.security;
}
public static class Security {
private final String username;
private final String password;
private final List<String> roles;
public Security(String username, String password, @DefaultValue("USER") List<String> roles) {
this.username = username;
this.password = password;
this.roles = roles;
}
public String getUsername() {
return this.username;
}
public String getPassword() {
return this.password;
}
public List<String> getRoles() {
return this.roles;
}
}
}
В этой обстановке,@ConstructorBinding
аннотацияиспользуется для обозначения того, чтоиспользовать Привязка конструктор. Это означает, что обязательность Воля ожидает найти конструктор с параметрами обязательности, которые вы ожидаете. еслитыиспользоватьиз Java 16 иливыше Версия,Привязку конструктора можно записывать и использовать вместе. в этом случае,Если у вас нет документированных нескольких конструкторов,в противном случае没有必хотетьиспользовать@ConstructorBinding
.
добрыйиз Вложенныйстановиться员@ConstructorBinding
(нравитьсяначальствоSecurity
пример)также Воляпроходить Что构造函数进行обязательность。
Можетиспользовать@DefaultValue
构造函数параметробозначениезначение по умолчанию,илисуществоватьиспользовать Java 16 или более поздняя версия, когда используется указанное значение компонента записи по умолчанию。Конвертировать Служить Воляиспользуется для ВоляString
ценить强制Конвертироватьдля缺失свойствоиз Цельдобрый型。
Обратитесь к предыдущему примеру,если没有свойствообязательностьприезжатьSecurity
,но ДолженMyProperties
Пример Воля Сумка Содержит одинnull
ценитьизsecurity
。хотеть使это Сумка Содержитодин非нулевойиз Пример,Security
Несмотря на то没有свойствообязательностьприезжатьэто(использовать Kotlin , для этого потребуется изusername
иpassword
параметрSecurity
заявлениедля可нулевойиз,Потому что у них нет значения по умолчанию),использоватьнулевой@DefaultValue
аннотация:
public MyProperties(boolean enabled, InetAddress remoteAddress, @DefaultValue Security security) {
this.enabled = enabled;
this.remoteAddress = remoteAddress;
this.security = security;
}
🚩 хотетьиспользовать Привязка конструктора,должениспользовать
@EnableConfigurationProperties
или@ConfigurationProperties
来давать возможностьдобрый。ты Нет能верно Зависит от常规 Spring Создание механизмаиз bean использовать Привязка конструктора(Например@Component
bean、использовать@Bean
метод创建из bean илииспользовать@Import
нагрузкаиз bean)📌 Если ваш класс имеет несколько конструкторов, вы также можете напрямую использовать @ConstructorBinding для обязательного наличия конструктора.
🚩 Нетпредположение Воля
java.util.Optional
и@ConfigurationProperties
Вместеиспользовать,Потому что он в основном используется как возвращаемый тип. поэтому,Он не очень хорошо подходит для внедрения свойств конфигурации. Чтобы сохранить атрибуты согласованными с другими типами и атрибутами,еслиты确实заявлениеполучил одинOptional
свойствоиэто没有ценить,Так Воляобязательностьnull
одиннулевойценить。
Spring Boot поставлять基础设施来обязательность@ConfigurationProperties
добрый型и Воляонизарегистрироватьсядля бобы. Вы можете включить свойства конфигурации для каждого класса или включить сканирование свойств конфигурации, которое работает аналогично сканированию компонентов.
иногда,саннотацияиздобрый@ConfigurationProperties
可能Нет适合扫描,Например,если вы разрабатываете свои собственные изавтоматические изменения или хотите включить их условно. в этих случаях,использовать@EnableConfigurationProperties
аннотацияобозначениехотеть处理издобрый型列表。этот Можетсуществоватьлюбой@Configuration
добрыйначальство完становиться,нравитьсяк Вниз Пример所示:
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(SomeProperties.class)
public class MyConfiguration {
}
Настройка сканирования атрибутов,пожалуйста Воля@ConfigurationPropertiesScan
аннотациядобавить вприезжатьтыизприложение.в целом,это被добавить вприезжатьс@SpringBootApplication
издобрыйсередина,但это Можетдобавить вприезжатьлюбой@Configuration
добрыйсередина。По умолчанию,Воля отсканировано из заявления аннотацияиз КЛАСС из Сумка. если Определить Сканировать из Указать Сумку,Вы можете сделать это, как показано в следующем примере:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "com.example.another" })
public class MyApplication {
}
когда
@ConfigurationProperties
использовать Конфигурациясвойство扫描илипроходить@EnableConfigurationProperties
зарегистрироваться фасоль, фасоль 有один约定имя:<prefix>-<fqn>
,в<prefix>
да@ConfigurationProperties
серединаобозначениеиз环境ключпрефикс,<fqn>
да bean полностью квалифицированное имя. если не указан префикс, используйте только bean полностью квалифицированное имя. В приведенном выше примере из bean имядаcom.example.app-com.example.app.SomeProperties
.
наспредположение@ConfigurationProperties
Работайте только с окружающей средой,特别да Нетхотетьотначальство Вниз文серединаинъекциядругой бобы. В крайних случаях используйте setter инъекцияили*Aware
框架поставлятьизлюбойинтерфейс(Например,EnvironmentAware
еслитынуждатьсядоступEnvironment
)。еслиты仍想использовать构造函数инъекциядругой bean, затем настройте свойства bean должен Комментарий@Component
ииспользоватьна основе JavaBean изсвойствообязательность。
Этот тип конфигурации особенно подходит для внешней конфигурации YAML SpringApplication.,нравиться Внизпример所示:
my:
service:
remote-address: 192.168.1.1
security:
username: "admin"
roles:
- "USER"
- "ADMIN"
хотетьиспользовать@ConfigurationProperties
bean,Можно вводить так же, как и любой другой боб.,нравиться Внизпример所示:
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final MyProperties properties;
public MyService(MyProperties properties) {
this.properties = properties;
}
public void openConnection() {
Server server = new Server(this.properties.getRemoteAddress());
server.start();
// ...
}
// ...
}
Use@ConfigurationProperties также может генерировать файлы метаданных.,IDEМожетиспользоватьэтот些документ自动完становиться Собственныйизключ。Посмотреть подробностиприложение。
Кроме сипользовать@ConfigurationPropertiesаннотация класса,Вы также можете сделать это с помощью общедоступных методов @Bean. Если вы хотите, чтобы недвижимость Воля была заселена не под вашим контролем и со сторонними компонентами,Это особенно полезно.
хотетьотEnvironment
середина Конфигурацияbean,пожалуйста Воля@ConfigurationProperties
добавить вприезжать Чтоbeanзарегистрироватьсясередина,нравитьсяк Вниз Пример所示:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class ThirdPartyConfiguration {
@Bean
@ConfigurationProperties(prefix = "another")
public AnotherComponent anotherComponent() {
return new AnotherComponent();
}
}
использоватьanother
префиксопределениеизсвойство都кдобрый似于ПереднийизSomeProperties
Примеризотображение режимаприезжать ДолженAnotherComponent на бобе.
Spring Bootиспользоватьнекоторые свободныеиз规но ВоляEnvironment
свойствообязательностьприезжать@ConfigurationProperties
bean,поэтому,Environment
свойствоимяиbeanсвойствоимя之间Нетнуждаться完全匹соответствовать。этот很有用из常见Пример Сумкавключатьк破折号точкаразделенныйиз环境свойство(Например,context-path
обязательностьприезжатьcontextPath
),икапитализ环境свойство(Например,PORT
обязательностьприезжатьport
)。
Например, следующий класс @ConfigurationProperties:
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "my.main-project.person")
public class MyPersonProperties {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
использовать Приведенный выше код может использовать следующие атрибуты:
Property | Note |
---|---|
my.main-project.person.first-name | Рекомендуется поместить его в файл .properties.ymlиспользовать |
my.main-project.person.firstName | Стандартное письмо из верблюжьего дела |
my.main-project.person.first_name | Подчеркнуть обозначение,Рекомендуется поместить его в файл .properties.ymlиспользовать |
MY_MAINPROJECT_PERSON_FIRSTNAME | формат заглавных букв,Рекомендуется установить его в переменных системного окружения. |
аннотацияизпрефиксценитьдолжендаkebabСлучай(小写и用
-
точкаразделенный,Напримерmy.main-project.person
)。
Property Source | Simple | List |
---|---|---|
Properties Files | Верблюжий регистр, строчные буквы для кебаба или подчеркивание. | Стандартно изиспользовать[ ]или значение сокращения запятой |
YAML Files | Верблюжий регистр, строчные буквы для кебаба или подчеркивание. | Стандартный список YAML или значение вырезания запятой |
Environment Variables | к Вниз划线作дляточкаразделенный符изформат заглавных букв( Binding From Environment Variables). | Окружите значения подчеркиванием Сумка (см. Привязка из переменных среды) |
System properties | Верблюжий регистр, строчные буквы для кебаба или подчеркивание. | Стандартно изиспользовать[ ]или значение сокращения запятой |
Мы рекомендуем по возможности хранить атрибуты Воли в формате «кебаб» строчными буквами, например my.person.first-name=Rod.
обязательностьприезжатьMapКонфигурациячас,Может потребоваться использование специальных обозначений в квадратных скобках.,так что保留原始ключценить。если Ключ не был[]
Сумкаокружать,нодля非字母数字、-
или.
любой字符Воляудаленный。
Например,к Вниз ПримеробязательностьприезжатьMap<String,String>
:
my.map.[/key1]=value1
my.map.[/key2]=value2
my.map./key3=value3
Для файлов YAML скобки необходимо заключать в кавычки, чтобы ключи анализировались правильно.
начальство面из Конфигурация Воляк/key1
、/key2
иkey3
作для映射серединаизключобязательностьприезжатьMap。斜线已отkey3
серединаудалить,Потому что оно не заключено в квадратные скобки Сумка.
Когда обязательностьприезжать скалярное значение,использоватьключ.
в Нетнуждаться被[]
Сумкаокружать。标量ценить Сумкавключатьперечислять
иjava.lang
Сумкасередина除Object
之снаружиизвседобрый型。Воляa.b=c
обязательностьприезжатьMap<String, String>
Волясохранит.
,ивозвращаться Сумка Содержит{"a.b"="c"}
элементизmap。длялюбойдругойдобрый型,еслиключ Сумка Содержит.
,нонуждатьсяиспользоватьвключать号выражать法。например,Воляa.b=c
обязательностьприезжатьMap<String, Object>
,Волявозвращаться{"a"={"b"="c"}}
элементизmap,и[a.b]=c
Волявозвращаться{"a.b"="c"}
элементизmap。
大多数操作системаверно Доступный于переменные средыизимяналагать строгостьиз规но。Например,Linux Переменные оболочки могут содержать только буквы (aприезжатьzилиаприезжатьz), цифры (0приезжать9) и символы подчеркивания (_). По соглашению, Unix Переменные оболочки изимя и Воля представлены прописными буквами.
Правила Spring Boot максимально совместимы с этими ограничениями на имена.
Чтобы воля из атрибута имя преобразовать в каноническую форму имя, можно следовать следующим правилам:
.
替换для_
-
Например,одинspring.main.log-startup-info
Преобразование недвижимостидляпеременные средыназаддляSPRING_MAIN_LOGSTARTUPINFO
。
Также можно использовать список объектов обязательностиприжатез, использовать переменную среды. я.Чтобы обязательностьприезжатьList, номер элемента должен быть заключен в подчеркивание Сумма в переменной имя.
Например,одинmy.service[0].other
Конвертироватьдляпеременные средыназаддаMY_SERVICE_0_OTHER
。
При настройке списков в нескольких местах,крышкапроходить Заменить весь список, чтобы работало。Например,гипотезаMyPojoобъектизимяиописыватьсвойствопо умолчаниюдляnull
。к Вниз Пример显示MyPropertiesсерединаизMyPojoобъект列表:
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("my")
public class MyProperties {
private final List<MyPojo> list = new ArrayList<>();
public List<MyPojo> getList() {
return this.list;
}
}
Его можно настроить следующим образом:
my.list[0].name=my name
my.list[0].description=my description
#---
spring.config.activate.on-profile=dev
my.list[0].name=my another name
еслиdev
Не активировано,MyProperties.list
Сумка СодержитодинMyPojo
элемент,еслиdev
активация,Однако,Список пока только Сумка Содержитодин条目(имядляmy another name
,описание пустое). Эта конфигурация не добавляет в список второй экземпляр MyPojo.,Проекты также не будут объединены.
Если список указан в нескольких профилях, «Воляиспользовать» имеет приоритет над самым высоким из профилей (и исполь зовать только для этого профиля).
my.list[0].name=my name
my.list[0].description=my description
my.list[1].name=another name
my.list[1].description=another description
#---
spring.config.activate.on-profile=dev
my.list[0].name=my another name
В предыдущем примере,dev
активация,MyProperties.list
Сумка СодержитодинMyPojo
элемент,nameдляmy another name
иdescriptionдляnull
。дляYAML,Списки, разделенные запятыми, и списки YAML можно использовать для полной перезаписи содержимого списка.
Для свойств карты,Для обязательности можно получить значения атрибутов из нескольких источников. но,Для одного и того же атрибута в нескольких источниках,Воляиспользовать имеет наивысший приоритет изсвойства. Пример ниже.,MyProperties
общественныйполучил одинMap<String, MyPojo>
свойство.
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("my")
public class MyProperties {
private final Map<String, MyPojo> map = new LinkedHashMap<>();
public Map<String, MyPojo> getMap() {
return this.map;
}
}
Следующий пример конфигурации:
my.map.key1.name=my name 1
my.map.key1.description=my description 1
#---
spring.config.activate.on-profile=dev
my.map.key1.name=dev name 1
my.map.key2.name=dev name 2
my.map.key2.description=dev description 2
еслиdev
Не активировано,MyProperties.map
только Сумка Содержитодинkeyдляkey1
изэлемент(nameдаmy name 1
,descriptionдаmy description 1
)。еслиdev
активация,Воля Сумка Содержит两个проектключдляkey1(nameдаdev name 1
,descriptionдаmy description 1
),ключдляkey2(nameдаdev name 2
,descriptionдаmy description 2
)
Вышеупомянутые правила слияния применяются ко всем конфигурациям источников свойств, а не только к файлам.
когдаобязательностьприезжать@ConfigurationProperties bean, Spring Boot попытается принудительно присвоить свойству внешнего приложения «Воля» правильный тип. если требуется пользовательский тип Конвертировать, который может предоставить ConversionService bean(сназванныйconversionService
изbean)или自определениесвойство编辑устройство(проходитьCustomEditorConfigurer
bean)илисделанный на заказConverter
(с@ConfigurationPropertiesBinding
аннотацияизbeanопределение)。
Потому что этот компонент был запрошен на раннем этапе существования компонента.,пожалуйста确保限制
ConversionService
正существоватьиспользоватьиз Зависимости。в целом,Любые зависимости, которые вам нужны, могут быть не полностью инициализированы при создании. если Конфигурационный ключ не является обязательным,И зависит только от пользовательского Конвертировать, квалифицированного с помощью @ConfigurationPropertiesBinding из,но可能нуждаться重命名自определениеConversionService
。
Spring Boot поддерживает длительность,еслитыобщественныйjava.time.Duration
,В приложении можно использовать следующие форматы:
long
описывать,если没有обозначение@DurationUnit
,По умолчанию — миллисекунды.java.time.Duration
использоватьизстандартныйISO-8601Форматimport java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
@ConfigurationProperties("my")
public class MyProperties {
@DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30);
private Duration readTimeout = Duration.ofMillis(1000);
public Duration getSessionTimeout() {
return this.sessionTimeout;
}
public void setSessionTimeout(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
public Duration getReadTimeout() {
return this.readTimeout;
}
public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
}
}
Укажите тайм-аут сеанса 30 с.,ПТ30Си30с эквивалент,读取超час500msМожетк Вниз列任意формаобозначение:500
、PT0.5S
и500ms
。
Вы также можете использовать любой поддерживаемый модуль:
ns
наносекундаus
микросекундыms
миллисекундаs
Второйm
точкаh
Часd
небоЕдиница по умолчанию — миллисекунда.,Можетиспользовать@DurationUnit
переписать,нравитьсяначальство面из Пример所示。
еслиты喜欢использовать Привязка конструктора,Может ли организованный то же самое из атрибута,нравитьсяк Вниз Пример所示:
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
import org.springframework.boot.convert.DurationUnit;
@ConfigurationProperties("my")
@ConstructorBinding
public class MyProperties {
private final Duration sessionTimeout;
private final Duration readTimeout;
public MyProperties(@DurationUnit(ChronoUnit.SECONDS) @DefaultValue("30s") Duration sessionTimeout,
@DefaultValue("1000ms") Duration readTimeout) {
this.sessionTimeout = sessionTimeout;
this.readTimeout = readTimeout;
}
public Duration getSessionTimeout() {
return this.sessionTimeout;
}
public Duration getReadTimeout() {
return this.readTimeout;
}
}
Если для обновления атрибута Long обязательно определите единицу измерения (использовать@DurationUnit) (если не миллисекунда). Это обеспечивает прозрачный путь обновления и поддерживает более широкие форматы.
Помимо продолжительности, весна Загрузка в порядке Тип Java.time.Period. Конфигурация приложения может использовать следующий формат:
int
описывать,по умолчаниюиспользоватьнебо,除非обозначение Понятно@PeriodUnit
java.time.Period
использоватьстандартныйизISO-8601
Простой формат поддерживает следующие единицы:
y
Годm
лунаw
неделяd
небоТип java.time.Period на самом деле никогда не хранит номер недели, это сокращение, означающее «7небо»из.
Spring Framework имеет тип значения DataSize, который представляет размер в байтах.,еслитыхотетьобщественныйDataSize
,Можно использовать следующие форматы:
long
Формат,по умолчаниюиспользоватьbytes,除非обозначение Понятно@DataSizeUnit
Пример:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DataSizeUnit;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;
@ConfigurationProperties("my")
public class MyProperties {
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize bufferSize = DataSize.ofMegabytes(2);
private DataSize sizeThreshold = DataSize.ofBytes(512);
public DataSize getBufferSize() {
return this.bufferSize;
}
public void setBufferSize(DataSize bufferSize) {
this.bufferSize = bufferSize;
}
public DataSize getSizeThreshold() {
return this.sizeThreshold;
}
public void setSizeThreshold(DataSize sizeThreshold) {
this.sizeThreshold = sizeThreshold;
}
}
Чтобы указать размер буфера 10 мегабайт, эквивалентно 10 МБ. Порог размера в 256 байт можно указать как 256 и 256B. Вы также можете использовать любой поддерживаемый модуль. Это:
B
bytesKB
kilobytesMB
megabytesGB
gigabytesTB
terabytesЕдиница измерения по умолчанию — байты.,Может быть переопределено @DataSizeUnit,нравитьсяначальство面из Пример所示。
еслиты喜欢использовать Привязка конструктора,Может ли организованный то же самое из атрибута,нравитьсяк Вниз Пример所示:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
import org.springframework.boot.convert.DataSizeUnit;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;
@ConfigurationProperties("my")
@ConstructorBinding
public class MyProperties {
private final DataSize bufferSize;
private final DataSize sizeThreshold;
public MyProperties(@DataSizeUnit(DataUnit.MEGABYTES) @DefaultValue("2MB") DataSize bufferSize,
@DefaultValue("512B") DataSize sizeThreshold) {
this.bufferSize = bufferSize;
this.sizeThreshold = sizeThreshold;
}
public DataSize getBufferSize() {
return this.bufferSize;
}
public DataSize getSizeThreshold() {
return this.sizeThreshold;
}
}
Если Чтобы обновить свойство Long, обязательно определите единицу измерения (использовать@DataSizeUnit) (если не байты). Это обеспечивает прозрачный путь обновления и поддерживает более широкие форматы.
когда@ConfigurationPropertiesдобрый被Springиз@Validated
аннотация Комментарийчас,Spring Boot попытается их проверить. Вы можете напрямую связаться с нами по адресу Класс конфигурацииначальствоиспользоватьJSR-303 javax.validation
约束Комментарий。хотеть做приезжатьэтот一点,Убедитесь, что в вашем пути к классам есть совместимая реализация JSR-303.,Затем добавьте аннотацию ограничений к полям,нравиться Внизпример所示:
import java.net.InetAddress;
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@ConfigurationProperties("my.service")
@Validated
public class MyProperties {
@NotNull
private InetAddress remoteAddress;
public InetAddress getRemoteAddress() {
return this.remoteAddress;
}
public void setRemoteAddress(InetAddress remoteAddress) {
this.remoteAddress = remoteAddress;
}
}
тывозвращаться Можетпроходить Комментарий@Bean
метод来курокпроверять,Метод use@Validated создает свойство конфигурации.
Чтобы гарантировать, что проверка всегда срабатывает для вложенных свойств.,Даже если вы не можете найти место,Также необходимо использовать соответствующие поля @Validannotation. Следующий пример основан на предыдущем примере MyProperties:
import java.net.InetAddress;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@ConfigurationProperties("my.service")
@Validated
public class MyProperties {
@NotNull
private InetAddress remoteAddress;
@Valid
private final Security security = new Security();
public InetAddress getRemoteAddress() {
return this.remoteAddress;
}
public void setRemoteAddress(InetAddress remoteAddress) {
this.remoteAddress = remoteAddress;
}
public Security getSecurity() {
return this.security;
}
public static class Security {
@NotEmpty
private String username;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
}
}
тывозвращаться Можетпроходить创建названныйconfigurationPropertiesValidator
изbeanопределение来добавить в自определениеSpring Валидатор. Методы @Bean должны быть объявлены статическими. Атрибут конфигурации проверка был создан в начале жизни приложения «Неделяиз», а метод Воля@Bean объявлен как статический для создания компонента без создания экземпляра класса @configuration. Это позволит избежать проблем, которые могут возникнуть при раннем создании экземпляра.
Spring-Boot-ActuatorСумка заключает в себе конечную точку,этообщественныйвсе
@ConfigurationProperties
bean。ВоляwebПросматриватьустройство指向/actuator/configprops
илииспользовать ЭквивалентизJMXконечная точка。有关Подробности,пожалуйста参阅“[производство функция готово](#11. Готовые к производству функции)».
@Value
аннотациядаодин核心контейнер Функция,Он по-разному обеспечивает функциональность и типобезопасные свойства конфигурации. В следующей таблице приведены поддерживаемые функции @ConfigurationProperties и @Value:
Feature | @ConfigurationProperties | @Value |
---|---|---|
свободный переплет | Yes | Limited (see note below) |
Поддержка метаданных | Yes | No |
SpEL-выражение | No | Yes |
еслиты确实想использовать
@Value
,наспредположениетыиспользовать规范форма Цитироватьсвойствоимя(kebab-caseтолькоиспользоватьстрочные буквы)。этот ВоляпозволятьSpring Bootииспользоватьсвободный переплетиз @ConfigurationProperties то же самое из логики. Например,@Value(“{demo.item-price}”)Воля Получить форму demo.iitem-priceиdemo.itermPrice из файла application.properties,И получить DEMO_ITEMPRICE из системного окружения. если вместо этого использовать@Value(“{demo.itemPrice}”),demo.item-price иDEMO_ITEMPRICE рассматриваться не будут.
Компонент If выowniz определяет набор конфигурационных ключей.,Мы рекомендуем вам приезжать в группу Воляточка с аннотацией @ConfigurationProperties изPOJO. Выполнение этого Воля дает вам структурированные из типобезопасных объектов.,Вы можете внедрить его в свой приезд из Bean.
При анализе этих файлов и заполнении среды,Файл свойств приложения не будет обработан из выражения SpEL. но,Выражение SpEL можно записать в @Value. Значением атрибута из в файле свойств еслиприложение является выражение SpEL.,Затем Воля оценивает это, когда проводит@valueиспользовать.
Пружинные профили позволяют изолировать точки конфигурации приложения.,使Чтотолькосуществоватьидентификация环境середина Доступный。любой@Component
、@Configuration
или@ConfigurationProperties
都Может用@Profile
отметка加к限制,нравиться Внизпример所示:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {
// ...
}
Если @ConfigurationProperties Компонент использует @EnableConfigurationProperties вместо автоматического сканирования регистрации, вам необходимо указать @Profileаннотацию в классе с помощью @EnableConfigurationPropertyаннотацияиз@Configuration. В случае сканирования @ConfigurationProperties @Profile можно указать в самом классе @ConfigurationProperties.
Можетиспользоватьspring.profiles.active
Environmentсвойство来обозначение哪些Конфигурациядокумент处于活动состояние。ты Может用本章Переднийописыватьизлюбой方式обозначениесвойство,Например,Вы можете Воля свою Сумку включить в application.properties,нравиться Внизпример所示:
spring.profiles.active=dev,hsqldb
также Можетиспользоватьк Внизоткрыть关существовать Заказ行начальствообозначениеэто:--spring.profiles.active=dev,hsqldb
。
если профиль не активирован,Файл конфигурации по умолчанию включен. Профиль по умолчанию — имя по умолчанию.,Можетиспользоватьspring.profile.default
Свойства среды настраивают его, как показано в следующем примере:
spring.profiles.default=none
spring.profiles.active
иspring.profiles.default
может толькосуществовать非Конфигурациядокументидентификацияиздокументсерединаиспользовать。этот意味着они Нет能Сумка Содержитсуществоватьspring.config.activate.on-profile
активацияизконкретный профильиздокументилиАктивировать свойствасередина。
Например, следующая конфигурация недействительна:
# this document is valid
spring.profiles.active=prod
#---
# this document is invalid
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
spring.profiles.active
свойство遵循идругойсвойствотакой жеиз排序规но。PropertySource
высший приоритет,этот意味着ты Можетсуществоватьapplication.properties
серединаобозначение活动Конфигурациядокумент,Затемиспользовать Заказ行открыть关替换они。
иногда,Воля Конфигурациядобавить вприезжать活动Конфигурациядокументвместо того, чтобы заменить ихда很有用из。spring.profiles.include
свойство Доступный于существоватьspring.profiles.active
свойствоактивацияиз Конфигурациядокумент之начальство Добавить профиль активности。
Точка входа SpringApplication также имеет дополнительные файлы конфигурации для настройки Java. API,пожалуйста参阅SpringApplicationсерединаизsetAdditionalProfiles()
метод。
Например,При запуске следующего конфигурационного приложения,Несмотря на тоиспользовать-spring.profiles.active Переключатель также активирует общий локальный файл конфигурации:
spring.profiles.include[0]=common
spring.profiles.include[1]=local
иspring.profile.active аналогичен,
spring.profile.include
может толькоиспользуется для非Конфигурациядокументидентификацияиздокумент。
Если данное из профиля активное состояние, вы также можете использовать Профильную группа (предлагается в следующем разделе) Добавить активность из профиля.
иногда,Ваше определение в приложении ииспользоватьиз профиля слишком детальное.,использовать хлопотно. Например,Функциональность базы данных и обмена сообщениями можно включить независимо с помощью файлов конфигурации proddb и prodmq.
Чтобы добиться этого, Spring Boot позволяет определить Профильную группа。Профильная группа позволяет определить связанную Профильную группаизлогикаимя。
Например,нас Может创建один Зависит отprodbиprodmqПрофильная группа становитьсяиз продюсерской группы.
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
насизприложение现существовать Можетиспользовать--spring.profiles.active=production
запускать,Активируйте файлы конфигурации производства и proddbиprodmq один раз.
ты Можетсуществоватьприложениебегать ДопроходитьвызовSpringApplication.setAdditionalProfiles(...)
,возвращаться МожетиспользоватьSpringизConfigurationEnvironment
интерфейсактивация Конфигурациядокумент。
application.properties
(илиapplication.yml
)ипроходить@ConfigurationProperties
Цитироватьиздокументизконкретный профильиз Варианты都被视длядокументи被нагрузка。有关Подробности,пожалуйста参阅“Файлы, специфичные для профиля”。
Последующие главы не завершены и нуждаются в дополнении.