Справочное руководство по Spring Boot на китайском языке
Справочное руководство по Spring Boot на китайском языке

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.х еще какое-то время будет основной

1. Предварительный просмотр документа

2. начать

В этом разделе обсуждается весна Boot представляет А как Установить, мы Воля поможем вам построитьпервый Spring Boot приложения, обсуждая при этом некоторые основные принципы.

2.1 Введение в Spring Boot

Spring Boot помогает создавать приложения Spring промышленного уровня, которые могут работать независимо.

Весна, которую ты создал Boot приложение,Можетпроходитьjava -jar или ТрадицияизwarСумказапуск режима,кроме того Также предоставляетбегатьspring scriptsиз Инструменты командной строки。

2.2 Системные требования

Spring Boot 2.7.8 Требуется Java8 , совместим с Java19, Spring Версия5.3.25иливыше。

Инструменты сборки

Версия

Maven

3.5+

Gradle

6.8.x, 6.9.x, and 7.x

2.2.1 Контейнер сервлетов

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+.

2.3 Установка Spring Boot

Установить Доиспользоватьjava -versionисследовать Java Версия,Spring Boot 2.7.8 Требуется Java8 иливышеиз Версия。

2.3.1 Для разработчиков Java

Установка Maven

Spring Boot Зависимостииспользоватьorg.springframework.boot groupId。в целом,тыизMaven POMФайлы, унаследованные отspring-boot-starter-parent и объявите одну или несколько зависимостей «Starter».

Кроме того, весна Boot Также предоставляется дополнительный Maven. Плагин для создания исполняемого jar-файла, дополнительную информацию см. Документация по плагину Spring Boot Maven

Установка Gradle

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

2.3.2 Установка CLI Spring Boot

Spring Boot CLI — это инструмент командной строки, который можно использовать для быстрого создания приложений инициализации Spring Boot, что очень полезно, если у вас нет IDE.

Ручная установка

Вы можете скачать Spring по следующему адресу CLIизданный Версия:

Также предоставлено Список снимков

После загрузки,Следуйте инструкциям, чтобы распаковать архив.изINSTALL.txtИнструкции по эксплуатации。.zipдокументизbin/В каталоге есть такойspringСкрипт(Применимо кWindowsизspring.bat),или Можетиспользоватьjar -jar бегать пакет из баночки.

Установить с помощью SDKMAN

SDKMAN (Менеджер средств разработки программного обеспечения) можно использовать для управления различными двоичными SDK, включая Groovy и Spring. Boot CLI。отsdkman.ioПолучите ииспользовать Следующая команда Установить Spring Boot:

Язык кода:javascript
копировать
$ sdk install springboot
$ spring --version
Spring CLI v2.7.8

Если вы используете функцию разработки CLI и хотите получить доступ к своей сборке версии, используйте следующую команду:

Язык кода:javascript
копировать
$ 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это все самое последнееиз。

Посмотреть его можно следующей командой:

Язык кода:javascript
копировать
$ sdk ls springboot

================================================================================
Available Springboot Versions
================================================================================
> + dev
* 2.7.8

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
Установить с помощью OSX Homebrew.

существоватьMacначальство МожетиспользоватьHomebrewУстановить。

Язык кода:javascript
копировать
$ brew tap spring-io/tap
$ brew install spring-boot

Homebrew Установить spring приезжать /usr/local/bin.

если Невозможно найти команду приехать,пытатьсяиспользоватьbrew updateПопробуйте еще раз после обновления

Установить с помощью MacPorts

существоватьMacначальствоиспользоватьMacPorts Установить。

Язык кода:javascript
копировать
$ sudo port install spring-boot-cli
Установить с помощью Windows Scoop

существоватьWindowиспользоватьScoopУстановить。

Язык кода:javascript
копировать
> scoop bucket add extras
> scoop install springboot

Scoop Установить spring приезжать ~/scoop/apps/springboot/current/bin

если команда приглашения не существует,пожалуйстаиспользоватьscoop updateОбновите и попробуйте еще раз

Пример быстрого запуска Spring CLI

首先创建одинназванныйapp.groovyиздокумент。

Язык кода:javascript
копировать
@RestController
class ThisWillActuallyRun {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}

Затемиспользоватьнравитьсяотдавать приказыбегать:

Язык кода:javascript
копировать
$ spring run app.groovy

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

наконец,использовать Браузер открываетсяlocalhost:8080,выход

Язык кода:javascript
копировать
Hello World!

2.4 Разработка первого приложения Spring Boot

предположениеиспользоватьstart.spring.io Создать весну Boot приложение.

3. Обновите Spring Boot

3.1 Обновление с версии 1.x

Обновление с версии 1.x,Может ПроверятьGitHub Руководство по обновлению на вики

3.2 Обновление до последней версии функции

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

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

После завершения обновления удалите зависимость.

4. Разработка Spring Boot

4.1 Сборка системы

Можно использовать систему сборки Maven, Gradle, Ant.

4.1.1 Starters

Все официальные лаунчеры следуют чему-то вродеизшаблон именования: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

4.2 Создание кода

Spring Boot не имеет фиксированного макета кода, но на некоторые практики можно ссылаться.

4.2.1 пакет «по умолчанию»

Когда в классе нет Сумка Содержитpackageчас,это被认длясуществовать“default package". Обычно не рекомендуется использовать "default". package”,это может вызвать@ComponentScan@ConfigurationPropertiesScan@EntityScanили@SpringBootApplication аннотация Что-то пошло не так,Мы должны следовать рекомендованному стилю именования из Сумка.,напримерcom.example.project

4.2.2 Основной класс программы

Обычно рекомендуется Воля Основной. класс программыпомещатьсуществоватьдругойдобрый之начальствоизкорень Сумкасередина,@SpringBootApplicationв целомпомещатьсуществовать主добрыйсередина,Его неявное значение определяет базовую функциональность поиска по сумме.,Введено внутри компании@EnableAutoConfigurationи@ComponentScan

Вот типичный макет:

Язык кода:javascript
копировать
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,Как показано ниже:

Язык кода:javascript
копировать
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);
    }

}

4.3 Класс конфигурации

Spring Boot Поддерживает настройку с использованием Java, хотя SpringApplication иXMLМожет Вместеиспользовать,但возвращатьсядапредположение@Configurationнезависимиздобрый。

4.3.1 Импорт других классов конфигурации

вам не нужно помещать всеиз@Configuration помещатьприезжатьодиндобрыйсередина,Должен@Importаннотация Может использоваться для импорта другихиз Класс конфигурации,или Можетиспользовать@ComponentScanАвтоматически получить всеизSpring компоненты,Сумкавключать@Configurationдобрый。

4.3.2 Импорт конфигурации XML

если вам все равно придется использовать конфигурацию XML,依然предположениеиспользовать@Configurationдобрый,Затемиспользовать@ImportResourceзагрузитьXMLКонфигурация。

4.4 Автоматическая настройка

Spring Загрузочный попробую Волястартеравтоматический конфигурацияприезжатьприложение,напримерпредставилHSQLDBизstarter,Но никакие компоненты подключения к базе данных не настраиваются вручную.,ТакSpring Boot База данных в памяти будет настроена автоматически.

включатьавтоматическая конфигурация,Нужно добавить@EnableAutoConfigurationили@SpringBootApplication

4.4.1 Замена автоматической конфигурации

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

использовать--debugзапускатьприложение,Можно распечатать, какая автоматическая модификация применяется в данный момент.

4.4.2 Отключение указанных классов автоконфигурации

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

Язык кода:javascript
копировать
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из Конфигурация来排除автоматическая конфигурациядобрый。

4.5 Spring Beans и внедрение зависимостей

Обычно рекомендуется внедрять зависимости в конструктор.,и@ComponentScanНаходитьbean。

если это код согласно способу сборки 4.2из,но Можетиспользовать@ComponentScanбез каких-либо параметровилииспользовать@SpringBootApplicationэто уже Сумка Содержит Понятно@ComponentScanаннотация,так всеизкомпоненты(@Component@Service@Repository@Controllerидругой)будет автоматически зарегистрирован какSpring Beans。

нравиться Следующий пример представляет собой@Serviceиспользоватьконструктор для внедренияRiskAssessor Bean。

Язык кода:javascript
копировать
import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

если у компонента есть несколько конструкторов,нуждатьсяиспользовать@Autowiredотметка哪个нуждатьсяSpring инъекция:

Язык кода:javascript
копировать
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отметка,Указывает, что его нельзя изменить позже.

4.6 Использование аннотации @SpringBootApplication

использовать@SpringBootApplicationаннотация Можетдавать возможностьнравиться Вниз三个Функция:

  • @EnableAutoConfiguration: Включить весну Boot изавтоматическая механизм конфигурации
  • @ComponentScan @Component:существоватьприложение所существоватьиз Сумканачальстводавать возможность扫描
  • @SpringBootConfiguration: Позволяет регистрировать дополнения в контексте beans или импортируйте дополнительные файлы из Класс конфигурации。Spring стандартныйизальтернатива@Configuration,Помогает обнаружить конфигурацию в интеграционных тестах.
Язык кода:javascript
копировать
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):

Язык кода:javascript
копировать
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);
    }

}

4.7 Запуск приложения

4.7.1 Запуск из IDE

4.7.2 Запуск упакованного приложения

использоватьjava -jarбегать:

Язык кода:javascript
копировать
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar

Также возможно подключить удаленный отладчик:

Язык кода:javascript
копировать
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myapplication-0.0.1-SNAPSHOT.jar

4.7.3 Использование плагина Maven

Spring Boot Maven плагин Сумка СодержитодинrunЗаказ:

Язык кода:javascript
копировать
$ mvn spring-boot:run

кроме тоговозвращаться МожетиспользоватьMAVEN_OPTS Установите переменные среды:

Язык кода:javascript
копировать
$ export MAVEN_OPTS=-Xmx1024m

4.7.4 Использование плагина Gradle

Gradleплагин Сумка СодержитодинbootRunЗаказ:

Язык кода:javascript
копировать
$ gradle bootRun

использоватьJAVA_OPTSУстановите переменные среды:

Язык кода:javascript
копировать
$ export JAVA_OPTS=-Xmx1024m

4.7.5 Горячее подключение

Spring Boot изгорячая заменана основеJVM,JVM ограничена определенной программой, которая может заменить байт-код,для完整方案МожетиспользоватьJRebel

spring-boot-devtoolsмодуль также Сумкавключатьверноприложение Быстрый перезапускизподдерживать,Подробности смотрите позжеизГорячая замена: «Как это сделать»

4.8 Инструменты разработчика

Spring Boot поставлятьspring-boot-devtools 模块поставлятьоткрыть发часиздополнительный Функция,Для поддержки этой функции,Зависимость Воля необходимо добавить в проект проживания:

Maven

Язык кода:javascript
копировать
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

Язык кода:javascript
копировать
dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

По умолчанию,бить Сумкаизприложение Нет Сумка Содержитdevtools,если хотите использовать определенную функцию удаленного инструмента разработки,Настроить в плагине Maven,исключение Devtools имеет значение false,Gradleплагинсередина КонфигурацияtaskЗадача начинается с Сумка СодержитdevelopmentOnly,нравиться

Язык кода:javascript
копировать
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, что означает, что вы можете предотвратить передачу инструментов разработчика для приезда проекта из других модулей.

4.8.1 Диагностика проблем с загрузкой классов

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

Чтобы определить, связано ли это с этой проблемой,Можетпытаться Отключить перезапуск,использоватьspring.devtools.restart.enabled=falseсвойство禁用это。

Кроме того, вы можете Пользовательский загрузчик классов перезапуска,Настройте, какой класс загружается,Посмотреть подробности[4.8.3Автоматический перезапуск](#4.8.3 Автоматический перезапуск)。

4.8.2 Значения атрибутов по умолчанию

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:

4.8.3 Автоматический перезапуск

Всякий раз, когда файл в пути к классам изменяется,использовать Понятно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),приведет к тому, что он не сможет работать должным образом.

⚠️Примечание автора:

После того, как автор так настроил, я обнаружил, что автоматический перезапуск не подвел.

Язык кода:javascript
копировать
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илинастраивать Конфигурациясвойство)

Отключить настройки отчетов:

Язык кода:javascript
копировать
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Оглавление:

Язык кода:javascript
копировать
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,нравиться Вниз:

Язык кода:javascript
копировать
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Конфигурацияобозначениедокумент(Нет Сумкавключать路径),Файл должен находиться в пути к классам.

Например: проект с такой структурой:

Язык кода:javascript
копировать
src 
+- main 
   +- resources 
      +- .reloadtrigger

Тогда конфигурация триггерного файла

Язык кода:javascript
копировать
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свойство被基добрыйнагрузкаустройство排除,Этот атрибут применяется к пути к классам с нерегулярным выражением.,нравиться:

Язык кода:javascript
копировать
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()объединитьиспользовать。

⚠️Примечание автора: думаю этот пункт можно пропустить

4.8.4 Загрузка в реальном времени

spring-boot-devtoolsСумка Содержитодин嵌入式изLiveReloadсервер,Доступный于资源变更час实часкурок Просматриватьустройство刷новый。LiveReload Просматриватьустройство扩展可отlivereload.com免费获得 Chrome、Firefox и Safari . если вы не хотите запускать приложение LiveReload сервер,ты Может Воля Долженspring.devtools.livereload.enabledсвойствоустановлен наfalse.

Вы можете запускать только один раз LiveReload сервер. Перед запуском приложения убедитесь, что нет других LiveReload Сервер собственный. если вы из IDE Запустить несколько приложений, затем поддерживается только первое приложение. LiveReload。

⚠️Примечание автора: думаю этот пункт можно пропустить, обновить браузер вручную не составит труда🤪

4.8.5 Глобальные настройки

Можетпроходить Воляк Внизлюбойдокументдобавить вприезжать$HOME/.config/spring-bootОглавление来Конфигурация全局 devtools настраивать:

  1. spring-boot-devtools.properties
  2. spring-boot-devtools.yaml
  3. spring-boot-devtools.yml

Добавить проживание в этот файл. Любая конфигурация будет применяться ко всем Spring на этой машине. Boot приложение,Например,хотеть Воля Автоматический перезапуск Конфигурациядляиспользоватьтриггерный файл,Его можно настроить следующим образом:

Язык кода:javascript
копировать
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параметр。

Язык кода:javascript
копировать
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s

Отслеживаемые каталоги путей к классам теперь опрашиваются на наличие изменений каждые 2 секунды с периодом молчания в 1 секунду, чтобы убедиться, что другие классы не изменились.

4.8.6 Удаленное приложение

Spring Boot поддерживает частичную удаленную функцию,Но существуют определенные риски безопасности,Доступно только в доверенной сети или SSL-защите.,И эту функцию невозможно включить в производственной среде.

Чтобы включить эту функцию, убедитесь в следующей конфигурации:

Язык кода:javascript
копировать
<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)。

Устанавливаемый удаленный клиент может выглядеть следующим образом:

Язык кода:javascript
копировать
  .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: 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.

4.9 Применение упаковки

использоватьMaven илиGradle Упакуйте приложение и создайте файл пакета jar.

5. Основные функции

5.1 SpringApplication

SpringApplicationпоставлятьполучил одинmain()Простой в использовании методSpring приложениезапускать,и делегировать статический методSpringApplication.run

Язык кода:javascript
копировать
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);
    }

}

После запуска,буду читатьприезжатьнравиться Внизинформация:

Язык кода:javascript
копировать
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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,приложениеиз логирования можно отключить.

5.1.1 Сбой при запуске

еслиприложение Запуск не удался,можетпроходить ЗарегистрированизFailureAnalyzersПолучите информацию об ошибке, чтобы вы могли решить проблему.。напримерприложениезапускатьиз8080Порт занят。

Язык кода:javascript
копировать
***************************
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включатьбревно:

Язык кода:javascript
копировать
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

5.1.2 Ленивая инициализация

SpringApplication допускает отложенную инициализацию приложений. Если включена отложенная инициализация, компоненты создаются при необходимости, а не во время запуска.

Одним из недостатков ленивой инициализации является задержка обнаружения проблем приложения. Если неправильно настроенный компонент инициализируется лениво, сбой не произойдет во время запуска, и проблема будет обнаружена только при инициализации компонента. Также позаботьтесь о том, чтобы у JVM было достаточно памяти для размещения всех компонентов. Поэтому рекомендуется точно настроить размер кучи JVM, прежде чем включать отложенную инициализацию.

использоватьSpringApplicationBuilderизlazyInitializationилиSpringApplicationизsetLazyInitializationметодвключать Ленивая инициализация,также Можетиспользоватьspring.main.lazy-initializationвключать。

Язык кода:javascript
копировать
spring.main.lazy-initialization=true

Укажите ленивую инициализацию определенных bean-компонентов,использовать@Lazy(false)

5.1.3 Пользовательские баннеры

проходить Воля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переменная.

5.1.4 Настройка SpringApplication

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

Язык кода:javascript
копировать
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 внешняя конфигурация)

5.1.5 Генератор API потоковой передачи

еслитынуждатьсястроитьApplicationContextИерархия(Иметь отношения между родителями и детьмииз Нескольконачальство Вниз文)илипредпочитатьиспользоватьпотоковая передачаAPIстроитьустройство,МожетиспользоватьSpringApplicationBuilder

SpringApplicationBuilder让ты Воля Несколько вызовов цепочки методов,СумкавключатьparentиchildМетод создания иерархической структуры,например:

Язык кода:javascript
копировать
new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

ApplicationContext创建Иерархия Есть некоторые ограничения. Например, Веб компонентыдолженСумка Содержитсуществовать子начальство Вниз文середина,итакой жеEnvironmentиспользуется для父начальство Вниз文и子начальство Вниз文。有关Подробности,пожалуйста参阅SpringApplicationBuilderJavadoc

5.1.6 Доступность приложения

При развертывании на платформе,приложение Можетиспользовать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 Зонд» для просмотра файла:

Язык кода:javascript
копировать
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;
        }
    }

}

Если приложение прервано и не может быть восстановлено, это приложение также можно обновить.

Язык кода:javascript
копировать
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)。

5.1.7 События приложения и прослушиватели

Кроме весны События за пределами Framework,напримерContextRefreshedEvent,SpringApplication Также будут отправлены некоторые дополнительные события.

有些событие实际начальстводасуществовать创建ApplicationContext创建До,поэтомуты Нет能作для@Beanзарегистрироваться监听устройство。тыможетпроходитьSpringApplication.addListeners(…)методилиSpringApplicationBuilder.listeners(…)зарегистрироваться。 еслинадеяться自动зарегистрироватьсяэтот些监听устройство,Может Воля监听устройстводобавить вприезжатьMETA-INF/spring.factoriesсередина,использоватьorg.springframework.context.ApplicationListener做дляkey。

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

  1. ApplicationStartingEvent Отправляется, когда приложение запускает проект (перед любой обработкой), за исключением случаев, когда зарегистрирован прослушиватель и инициализатор.
  2. ApplicationEnvironmentPreparedEventотправлять,когданачальство Вниз文серединахотетьиспользоватьизизвестныйEnvironmentчас但существовать创建начальство Вниз文До。
  3. ApplicationContextInitializedEventотправлять,существовать准备ПонятноApplicationContextивызов ПонятноApplicationContextInitializersназад,Но прежде чем загружать бобы
  4. ApplicationPreparedEventсуществовать刷новыйначинать До,Но отправляется после загрузки определения компонента
  5. ApplicationStartedEventсуществовать刷новыйначальство Вниз文之назад,Но отправляется до вызова любой программы командной строки приложения.
  6. AvailabilityChangeEventсуществоватьвыражатьприложениесостояниедляLivenessState.CORRECTчасотправлять
  7. ApplicationReadyEventсуществоватьлюбойприложениеи Заказ行程序被вызов之назадотправлять
  8. AvailabilityChangeEvent существоватьвыражатьприложение已经做好接收пожалуйста求准备часотправлять,состояниедляReadinessState.ACCEPTING_TRAFFIC
  9. ApplicationFailedEventсуществоватьзапускатьаномальныйчасотправлять

начальство面из Только список СумкавключатьиSpringApplicationСвязанныйизSpringApplicationEventсобытие。к ВнизсобытиетакжесуществоватьApplicationPreparedEvent之назадиApplicationStartedEventДоотправлять。

  • WebServerInitializedEventсуществоватьWebServer准备好назадотправлять,ServletWebServerInitializedEventиReactiveWebServerInitializedEventточка别даservlet и reactiveиз Варианты
  • ContextRefreshedEventсуществоватьApplicationContext刷новыйназадотправлять

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

приложениесобытиеиспользоватьSpring Frameworkизсобытие发布机制отправлять。Этот механизмиз Часть перваяточка确保существовать子начальство Вниз文середина发布给监听устройствоизсобытиетакже会существоватьлюбой祖先начальство Вниз文середина发布给监听устройство。поэтому,еслитыизприложениеиспользоватьSpringApplicationПримериз Иерархия,Прослушиватель может получать несколько экземпляров событий одного и того же типа.

Чтобы позволить слушателю зонировать свой контекст и события, контекст потомка и события.,Он должен запросить внедрение контекста приложения.,Затем Воляинъекцияизначальство Вниз文исобытиеизначальство Вниз文进行比较。МожетпроходитьвыполнитьApplicationContextAwareилиесли监听устройстводаbean,использовать@Autowired来инъекцияначальство Вниз文。

5.1.8 Веб-среда

SpringApplication会试картина创建正确добрый型изApplicationContext。используется для определенияWebApplicationTypeизалгоритмнравиться Вниз:

  • если существует Spring MVC,использоватьAnnotationConfigServletWebServerApplicationContext
  • если Spring MVC не существует Spring WebFlux 存существовать,использоватьAnnotationConfigReactiveWebServerApplicationContext
  • в противном случае,использоватьAnnotationConfigApplicationContext

этот意味着еслитыWebClientсуществовать同一приложениесерединаиспользовать Spring MVC и Spring WebFlux , то по умолчанию Воляиспользовать Spring MVC。ты МожетпроходитьвызовsetWebApplicationType(WebApplicationType)покрыть。

также Может完全控制ApplicationContextвызов所использоватьиздобрый型setApplicationContextClass(…)

существоватьJUnit测试серединаиспользоватьSpringApplicationчас,в целомнуждатьсявызовsetWebApplicationType(WebApplicationType.NONE)

5.1.9 Доступ к параметрам приложения

еслитынуждатьсядоступперешел кSpringApplication.run(…)изприложениепараметр,но Можетинъекцияorg.springframework.boot.ApplicationArguments bean。ApplicationArgumentsинтерфейспоставлятьверно原始String[]параметра также解析изoptionиnon-optionпараметриздоступ,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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иSpring Environment。этот使тывозвращаться Можетиспользовать@ValueКомментарийинъекция单个приложениепараметр。

5.1.10 Использование ApplicationRunner или CommandLineRunner

еслитынуждатьсясуществовать После запускабегатьнекоторые конкретныеизкодSpringApplication,ты МожетвыполнитьApplicationRunnerилиCommandLineRunnerинтерфейс。этот两个интерфейсктакой жеизспособ работы,и предоставитьrunметод,ДолженметодсуществоватьSpringApplication.run(…)完становиться До被вызов。

Идеально подходит для задач планирования после запуска приложения, но до того, как запрос будет принят.

этот些CommandLineRunnerинтерфейспоставлятьнить数组используется длядоступверноприложениепараметр,иApplicationRunnerиспользоватьApplicationArguments。к Вниз Пример显示ПонятноCommandLineRunnerодинrunметод:

Язык кода:javascript
копировать
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аннотация,

5.1.11 Выход из приложения

каждыйSpringApplication向 JVM зарегистрироватьсяодин关闭钩子,чтобы обеспечитьApplicationContextсуществовать退出час正常关闭。Можетиспользоватьвсестандартныйиз Spring жизньнеделяобратный вызов периода(НапримерDisposableBeanинтерфейсили@PreDestroyКомментарий)。

также,еслинадеятьсясуществоватьSpringApplication.exit()被вызовчасвозвращатьсяидентификацияиз退出код,но Можетвыполнить Долженинтерфейсorg.springframework.boot.ExitCodeGenerator,Затем Может Воля此退出кодперешел кSystem.exit()Что Воля作длясостояниевозврат кода,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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аннотация。

5.1.12 Функции администратора

Можетпроходитьобозначениеspring.application.admin.enabledсвойстводляприложениедавать возможностьи管理Связанныйиз Функция。этот暴露ПонятноSpringApplicationAdminMXBean平台начальствоизMBeanServer。ты Можетиспользовать此Функцияудаленный管理тыиз Spring Boot Приложение Эта функция также доступна для реализации любого сервиса Сумка-загрузчик.

Если вы хотите знать, где находится приложение HTTP 端口начальствобегать,Получатьlocal.server.portсвойствоизценить。

5.1.13 Отслеживание запуска приложения

Во время запуска приложения,SpringApplicationосуществлятьApplicationContextмногоиприложениежизньнеделя Ожидать、bean жизньнеделя Ожидать甚至处理приложениесобытие Связанныйиз Задача。有ПонятноApplicationStartupSpring Framework ,ты就МожетиспользоватьStartupStepобъекти踪приложениезапускатьзаказ。Может收集этот些数据используется дляточкаанализиз,или Просто чтобы лучше понять процесс запуска приложения.

МожетиспользоватьsetApplicationStartupнастраиватьодинвыполнитьApplicationStartupиз Пример,например,использоватьBufferingApplicationStartupиз Пример:

Язык кода:javascript
копировать
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、добрыйнагрузка……)Связанный联。Конфигурация完становитьсяназад,Вы можете записывать данные с включенным бортовым самописцем:

Язык кода:javascript
копировать
$ java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar demo.jar

Spring Boot 附带BufferingApplicationStartupВарианты;此выполнить旨существовать缓冲запускать步骤и Воляони排入снаружиотделение指标система。BufferingApplicationStartupприложение Можетсуществоватьлюбойкомпонентысерединапожалуйста求добрый型из bean 。

Spring Boot Его также можно настроить для предоставления JSON документпредоставленная форма此информацияизstartupконечная точка。

5.2 Внешняя конфигурация

Spring Boot Позволяет вам экспортировать вашу конфигурацию, чтобы вы могли использовать один и тот же код в разных средах. Вы можете использовать различные внешние источники конфигурации, в том числе Java Файл свойств, YAML Файлы, переменные среды и параметры командной строки。

Значения атрибутов можно вводить напрямую через аннотации. bean @Value,проходить Spring изабстрактныйEnvironmentдоступ,илипроходить@ConfigurationPropertiesобязательностьприезжатьобъект。

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

  1. Свойства по умолчанию,Зависит отSpringApplication.setDefaultPropertiesобозначение
  2. существовать@Configurationначальствоиз@PropertySourceаннотация,пожалуйста, обрати внимание,Прежде чем обновить контекст приложения,этот些свойство源Нет会добавить вприезжатьEnvironmentсередина。иlogging.* и spring.main.* читается до обновления контекста приложения.
  3. Данные конфигурации,напримерapplication.properties
  4. RandomValuePropertySourceсерединатолькодляrandom.*из Конфигурация
  5. Переменные среды операционной системы
  6. Конфигурация системы Java, System.getProperties()
  7. отjava:comp/envизJNDIсвойство
  8. ServletContext初始化параметр
  9. ServletConfig初始化параметр
  10. отSPRING_APPLICATION_JSONизсвойство,嵌入существоватьпеременные среды(environment variable ) или свойства системы (система свойство) встроенное JSON
  11. Параметры командной строки
  12. существовать单元测试серединаизproperties,существовать@SpringBootTest иДля тестирования приложения конкретного отдела точкаиз теста аннотацияначальство有效。
  13. 单元测试серединаиз@TestPropertySource
  14. При активации инструментов разработчика,$HOME/.config/spring-bootОглавлениесерединаизDevtoolsГлобальные настройки Конфигурация

Данные конфигурацииизнагрузка按照к Вниззаказ:

  • бить СумкасуществоватьjarСумкасерединаизКонфигурация приложения,application.properties и Варианты YAML
  • бить СумкасуществоватьjarСумкасерединаизapplication-{profile}.propertiesи YAML Варианты
  • jarСумкаснаружиизapplication.propertiesи YAML Варианты
  • jarСумкаснаружиизapplication-{profile}.propertiesи YAML Варианты

Рекомендуется использовать формат файла конфигурации, если он также имеет свойства и yaml, свойства имеют приоритет.

гипотезатыоткрыть发получил один@Componentиспользоватьnameсвойствоизприложение,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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"отделениеточка。

5.2.1 Доступ к свойствам командной строки

По умолчанию,SpringApplicationВолялюбой Заказ行选элементпараметр(То есть --началоизпараметр,Например--server.port=9000)Конвертироватьдляpropertyи Воляонидобавить вприезжать SpringEnvironmentсередина,Свойства командной строки всегда имеют приоритет над источниками свойств на основе файлов.

если Вы не хотите, чтобы свойства командной строки Воля добавлялись приезжать серединаEnvironment,ты МожетиспользоватьSpringApplication.setAddCommandLineProperties(false)отключить их。

5.2.2 Свойства приложения JSON

Переменные среды и системные свойства обычно имеют ограничения.,Это означает, что некоторые атрибуты имя нельзя использовать. Чтобы решить эту проблему,Spring Boot Позволяет закодировать блок свойств в один JSON структура.

Когда вы начнете,любойspring.application.jsonилиSPRING_APPLICATION_JSONсвойство Воля被解析идобавить вприезжатьEnvironment.

Например,SPRING_APPLICATION_JSONМожетсуществовать UN*X shell Атрибут Воля предоставляется как переменная среды в командной строке:

Язык кода:javascript
копировать
$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar

В предыдущем примере вы оказались в Spring изEnvironmentсередина Получатьmy.name=test

такой жеиз JSON Также может быть предоставлено как системное свойство:

Язык кода:javascript
копировать
$ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar

или вы можете использовать параметры командной предоставлено строкой JSON:

Язык кода:javascript
копировать
$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'

если развернуть приезжать классический сервер приложений,тывозвращаться Можетиспользоватьназванныйjava:comp/env/spring.application.jsonизJNDI переменная.

Несмотря на то, что изнул Воля добавляется в источник свойства результата в формате JSON, PropertySourcesPropertyResolver рассматривает атрибут Волянул как отсутствующий из значения. Это означает, что JSON не может перезаписать свойства с низким приоритетом в источнике нулевыми значениями.

5.2.3 Свойства внешнего приложения

Когда вы начнете,Spring Boot Воля自动отк Вниз Расположение Находитьинагрузкаapplication.propertiesиapplication.yaml

  1. из пути к классам
    • корневой каталог пути к классам
    • classpath из /config Сумка
  2. из текущего каталога
    • текущий каталог
    • текущий каталогизconfig/子Оглавление
    • подкаталог config/издирект

этот个列表按заказ排列(нижеизэлементы будут перезаписаны ранееизэлемент)。нагрузкаиздокумент会做дляPropertySourcesдобавить вприезжатьSpring Environmentсередина。

еслиты Нет想用application作для Конфигурациядокумент名,ты Можетпроходитьобозначениеодинspring.config.name环境свойство来切换приезжать另одиндокумент名。Например,хотеть Находитьmyproject.propertiesиmyproject.yamlдокумент,ты Может按нравиться Вниз方式бегатьтыизприложение:

Язык кода:javascript
копировать
$ java -jar myproject.jar --spring.config.name=myproject

тывозвращаться Можетиспользоватьspring.config.location环境свойство来Цитировать显式Расположение。此свойство接受одинили Несколькохотетьисследоватьиз Расположениеиззапятаяточкаразделенный список。

к Вниз Пример显示нравиться何обозначение两个Нет同издокумент:

Язык кода:javascript
копировать
$ 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/,Тогда полный набор позиций равен:

  1. optional:classpath:custom-config/
  2. optional:file:./custom-config/

если вы предпочитаете добавить другое местоположение,вместо того, чтобы заменить их,ты Можетиспользоватьspring.config.additional-location. Загрузка свойств из других мест может переопределить значение по умолчанию.

Например,еслиspring.config.additional-locationКонфигурация Понятноценитьoptional:classpath:/custom-config/,optional:file:./custom-config/,Тогда учтите, что полный набор позиций:

  1. optional:classpath:/;optional:classpath:/config/
  2. optional:file:./;optional:file:./config/;optional:file:./config/*/
  3. optional:classpath:custom-config/
  4. 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). Если указано несколько файлов конфигурации, будет использоваться последняя выигрышная стратегия. Например, если файл конфигурации prodlive да Зависит отspring.profiles.activeсвойствообозначениеиз,Такapplication-prod.propertiesсерединаизценить Может被application-live.propertiesсерединаизценитькрышка。

наконец获胜策略Применимо кгруппа местоположенийуровень。spring.config.locationизclasspath:/cfg/,classpath:/ext/Конфигурацияиclasspath:/cfg/;classpath:/ext/Конфигурацияизкрышка规но Нет同。

Например,Продолжить приведенные выше примеры изпрода и live,У нас могут быть следующие файлы:

Язык кода:javascript
копировать
/cfg
  application-live.properties
/ext
  application-live.properties
  application-prod.properties

spring.config.locationизценитьдляclasspath:/cfg/,classpath:/ext/,Программа сначала обработает его./cfgВнизизвседокумент,перерабатывать/ext

  1. /cfg/application-live.properties
  2. /ext/application-prod.properties
  3. /ext/application-live.properties

еслиценитьдляclasspath:/cfg/;classpath:/ext/,Программы рассматриваются как один уровень

  1. /ext/application-prod.properties
  2. /cfg/application-live.properties
  3. /ext/application-live.properties

Environment有一组по умолчанию Конфигурациядокумент(По умолчаниюдля[default]),если Активный профиль не установлен,Затем используйте эти профили. другими словами,если нет явного профиля активации,Так Воляучитыватьapplication-default

Конфигурациядокумент只нагрузка一次。еслиты已经Прямой импортПонятноконкретный файл свойств профиля, файл не будет импортирован повторно.

Импортировать дополнительные данные

приложение Конфигурация Можетиспользоватьspring.config.import Свойства импортируют больше данных конфигурации из других мест.

Например, путь к классам application.propertiesдокументсередина可能Сумка Содержитк Вниз内容:

Язык кода:javascript
копировать
spring.application.name=myapp
spring.config.import=optional:file:./dev.properties

Это Воля триггер текущий импорт файла каталога dev.properties (если существуетэтот样издокумент)。импортироватьизdev.propertiesсерединаизценить Воля优先于курокимпортироватьиздокумент。В приведенном выше примере,dev.propertiesМожет Воляspring.application.name重новыйопределениедля Нет同изценить。

Сколько бы раз это ни объявлялось,Их можно импортировать только один раз. Порядок отдельных документов, определенный в файле свойств импорта/yamliz, не имеет значения.,например,Следующие два примера дают одинаковые результаты.

Язык кода:javascript
копировать
spring.config.import=my.properties
my.property=value
Язык кода:javascript
копировать
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импортироватьэто:

Язык кода:javascript
копировать
spring.config.import=file:/etc/config/myconfig[.yaml]
Использование дерева конфигурации

существовать云平台(нравитьсяKubernetes)начальствобегатьприложениечас,Обычно необходимо прочитать значения конфигурации, предоставленные платформой. Для этой цели нередко используются переменные среды.,Но это может иметь недостатки,В частности, значение должно оставаться конфиденциальным.

В качестве альтернативной переменной окружения,много云平台现существоватьпозволятьты Воля Конфигурация映射приезжатьнагрузкаиз数据卷середина。Например,KubernetesМожет卷нагрузкаConfigMapsиSecrets

Доступны два распространенных режима монтажа тома:

  1. Один файл Сумка содержит полный набор атрибутов (обычно записывается как YAML)
  2. В дерево каталогов записывается несколько файлов, имя файла становится «ключом», а содержимое — «значением».

Для первого случая,МожетВышеуказанная конфигурацияиспользоватьspring.config.importимпортироватьYAMLилиPropertiesдокумент。

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

Например,Предположим, что Kubernetes Установить имеет следующие тома:

Язык кода:javascript
копировать
etc/
  config/
    myapp/
      username
      password

username даодин Конфигурацияизценить,passwordдаодин加密нить

Чтобы импортировать эти конфигурации,ты Может Волянравиться Вниз内容импортироватьapplication.propertiesилиapplication.yaml

Язык кода:javascript
копировать
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город Волявсе直接子级作для Дерево конфигурацииимпортировать。

Язык кода:javascript
копировать
etc/
  config/
    dbconfig/
      db/
        username
        password
    mqconfig/
      mq/
        username
        password

ты Можетиспользоватьconfigtree:/etc/config/*/作дляимпортировать Расположение:

Язык кода:javascript
копировать
spring.config.import=optional:configtree:/etc/config/*/

Вышеуказанная конфигурация будет импортирована. db.username, db.password, mq.username и mq.password свойство.

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

Конфиденциальные данные. Когда сервису Docker Swarm разрешен доступ к конфиденциальным данным,Долженконфиденциальные данные被装入контейнерсередина。Например,еслиназванныйdb.passwordизконфиденциальные данные Установитьсуществовать Расположение/run/secrets/,но Можетиспользоватьк Вниз变量db.passwordsсуществоватьSpring环境середина:

Язык кода:javascript
копировать
spring.config.import=optional:configtree:/run/secrets/
Заполнитель свойства

Значение из в application.propertiesиapplication.yml будет фильтроваться по существующему изEnvironment, когда оно используется.,поэтомуты Может Цитироватьк前определениеизценить(Например,отсистемасвойствоилипеременные среды)。стандартныйиз{name}Заполнитель Синтаксис свойств может находиться в любом месте значения изиспользовать, Заполнитель свойствавозвращаться Можетиспользовать:обозначениезначение по умолчанию,Волязначение по умолчаниюисвойствоимяточкаоткрыть,Например{name:default}。

к Вниз Пример显示Понятно带значение по умолчаниюи Нет带значение по умолчаниюиззаполнительизиспользовать:

Язык кода:javascript
копировать
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. Три последовательных дефиса обозначают конец одного документа и начало следующего документа.

Например, следующее содержит два логических документа:

Язык кода:javascript
копировать
spring:
  application:
    name: "MyApp"
---
spring:
  application:
    name: "MyCloudApp"
  config:
    activate:
      on-cloud-platform: "kubernetes"

application.propertiesдокументиспользовать#---или!--- разделить документ

Язык кода:javascript
копировать
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» активен:

Язык кода:javascript
копировать
myprop=always-set
#---
spring.config.activate.on-cloud-platform=kubernetes
spring.config.activate.on-profile=prod | staging
myotherprop=sometimes-set

5.2.4 Атрибуты шифрования

Spring Boot не предоставляет никаких свойств шифрованияиз内置поддерживать,但этопоставлять Понятно修改Spring环境середина Сумка Содержитценить所需източка крючка。EnvironmentPostProcessorпозволятьтысуществоватьприложениезапускатьизчас候控制Environment,Подробно ознакомьтесь с [Настраиваемые переменные среды при запуске] (#15. «Практическое руководство»).

если вам нужен безопасный способ хранения учетных данных и паролей,Spring Cloud Vaultпроект ВоляподдерживатьсуществоватьHashiCorp Vaultсередина存储Внешняя конфигурация。

5.2.5 Использование файлов YAML

YAMLдаJSONизсуперсет,Удобный формат для указания данных конфигурации точечного слоя. Пока библиотека SnakeYAML находится в пути к классам,SpringApplicationдобрый Воля自动поддерживатьYAML作дляpropertiesиззаменять。

Сопоставление YAML со свойствами

Документы YAML необходимо преобразовать из их иерархического формата, чтобы их можно было использовать в Spring. Environmentизплоскийструктура.

Например,нравиться ВнизизYAMLдокумент:

Язык кода:javascript
копировать
environments:
  dev:
    url: "https://dev.example.com"
    name: "Developer Setup"
  prod:
    url: "https://another.example.com"
    name: "My Cool App"

для ПонятноотEnvironmentсерединадоступэтот些свойство,Их выравнивают следующим образом:

Язык кода:javascript
копировать
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。

Язык кода:javascript
копировать
my:
 servers:
 - "dev.example.com"
 - "another.example.com"

После преобразования приведенного выше примера в свойства:

Язык кода:javascript
копировать
my.servers[0]=dev.example.com
my.servers[1]=another.example.com

использовать[index]выражатьизpropertiesможетобязательностьприезжатьJavaизListилиSetобъект。有关更多Подробности,См. ниже.

Невозможно загрузить файл YAML. Поэтому, если вам нужно загрузить значения таким способом, вам понадобится файл useproperties.

Загрузить YAML напрямую

Spring Framework предоставляет два удобных класса.,Доступный于нагрузкаYAMLдокумент。YamlPropertiesFactoryBeanВоляYAML作дляPropertiesнагрузка,YamlMapFactoryBeanВоляYAML作дляMapнагрузка。

Если вы хотите использовать YAML как Spring PropertySourceнагрузка,также МожетиспользоватьYamlPropertySourceLoaderдобрый。

5.2.6 Настройка случайных значений

RandomValuePropertySourceиспользуется дляинъекция随机ценить(Например,Внедрить зашифрованные символы или тестовый пример). Он может генерировать целые, длинные, uuidилистроки,нравиться Внизпример所示:

Язык кода:javascript
копировать
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 — максимальное значение (не входит в комплект).

5.2.7 Настройка свойств системной среды

Spring Boot поддерживает установку префиксов для свойств среды. если системная среда состоит из нескольких Spring с разными требованиями к конфигурации. Bootприложениеподелиться,этот Воля Очень полезно.система环境свойствоизпрефикс Может直接существоватьSpringApplicationначальствонастраивать。

Например,если Воляпрефиксустановлен наinput,но诸нравитьсяremote.timeout之добрыйизсвойствотакже Волясуществоватьсистема环境середина解析дляinput.remote.timeout

5.2.8 Типобезопасные свойства конфигурации

использовать@Value("${property}")инъекция Конфигурациясвойствоиногдабудет очень хлопотно,Особенно, если у вас есть несколько атрибутов и данных, которые по сути представляют собой слой данных. SpringBoot предоставляет еще один метод — использование свойств.,Этот метод позволяет управлять строго типизированными компонентами и проверять конфигурацию приложения.

Также проверьте @Value и type-safe configuration свойстваизразличия

Привязка свойств JavaBean

Может обязательностьприезжать стандарт из JavaBean,нравиться Внизпример所示:

Язык кода:javascript
копировать
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 определял следующие атрибуты:

  • my.service.enabled, по умолчанию — false
  • my.service.remote-address,может强制转становитьсяString
  • my.service.security.username
  • my.service.security.password
  • my.service.security.roles Тип строки из списка, по умолчанию — USER.

Картографирование приезжать Весна Класс @ConfigurationProperties, доступный в Boot, является общедоступным API. Эти классы представляют собой файлы свойств, файлы YAML, переменные среды и другие конфигурации механизмов, но сам класс издоступных геттеров/сеттеров не предназначен для прямого использования.

Такое расположение основано на пустом конструкторе по умолчанию, а методы получения и установки обычно являются обязательными, поскольку обязательность является стандартом для свойств JavaBeans, как и в Spring MVC. Сеттер можно опустить в следующих ситуациях:

  • Карты, если они инициализированы, требуют геттеров, но не обязательно требуют сеттеров, поскольку они могут быть изменены связующим.
  • Можетпроходитьиндекс(в целомиспользовать YAML) илииспользовать значения (атрибуты), разделенные одной запятой, для доступа к коллекции и массиву. В последнем случае установщик Это обязательно. Мы рекомендуем всегда добавлять setter。еслиты初始化один集合,пожалуйста确保это Нетда Нет可变из(нравиться Как показано в предыдущем примере)。
  • если Вложенныйиз POJO свойство被初始化(нравитьсяSecurityПередний Примерсерединаиз Поле),но Нетнуждаться сеттер. если вы хотите обязательно использовать его конструктор по умолчанию для динамического создания экземпляров, вам понадобится установщик.

有些人использовать Project Lombok чтобы автоматически добавлять getter и сеттер. убеждаться Lombok Для таких типов не создается специальный конструктор, поскольку контейнер автоматически использует его для создания экземпляра объекта. Наконец, просто рассмотрим критерии Java Bean Свойство обязательность статического свойства не поддерживается.

Привязка конструктора

Пример из предыдущего раздела можно переписать неизменяемым образом.,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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аннотация:

Язык кода:javascript
копировать
public MyProperties(boolean enabled, InetAddress remoteAddress, @DefaultValue Security security) {
    this.enabled = enabled;
    this.remoteAddress = remoteAddress;
    this.security = security;
}

🚩 хотетьиспользовать Привязка конструктора,должениспользовать@EnableConfigurationPropertiesили@ConfigurationProperties来давать возможностьдобрый。ты Нет能верно Зависит от常规 Spring Создание механизмаиз bean использовать Привязка конструктора(Например@Componentbean、использовать@Beanметод创建из bean илииспользовать @Importнагрузкаиз bean)

📌 Если ваш класс имеет несколько конструкторов, вы также можете напрямую использовать @ConstructorBinding для обязательного наличия конструктора.

🚩 Нетпредположение Воляjava.util.Optionalи@ConfigurationPropertiesВместеиспользовать,Потому что он в основном используется как возвращаемый тип. поэтому,Он не очень хорошо подходит для внедрения свойств конфигурации. Чтобы сохранить атрибуты согласованными с другими типами и атрибутами,еслиты确实заявлениеполучил одинOptionalсвойствоиэто没有ценить,Так Воляобязательность nullодиннулевойценить。

Включить тип аннотации @ConfigurationProperties

Spring Boot поставлять基础设施来обязательность@ConfigurationPropertiesдобрый型и Воляонизарегистрироватьсядля бобы. Вы можете включить свойства конфигурации для каждого класса или включить сканирование свойств конфигурации, которое работает аналогично сканированию компонентов.

иногда,саннотацияиздобрый@ConfigurationProperties可能Нет适合扫描,Например,если вы разрабатываете свои собственные изавтоматические изменения или хотите включить их условно. в этих случаях,использовать@EnableConfigurationPropertiesаннотацияобозначениехотеть处理издобрый型列表。этот Можетсуществоватьлюбой@Configurationдобрыйначальство完становиться,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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добрыйсередина。По умолчанию,Воля отсканировано из заявления аннотацияиз КЛАСС из Сумка. если Определить Сканировать из Указать Сумку,Вы можете сделать это, как показано в следующем примере:

Язык кода:javascript
копировать
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 изсвойствообязательность。

Используйте типы аннотаций @ConfigurationProperties.

Этот тип конфигурации особенно подходит для внешней конфигурации YAML SpringApplication.,нравиться Внизпример所示:

Язык кода:javascript
копировать
my:
  service:
    remote-address: 192.168.1.1
    security:
      username: "admin"
      roles:
      - "USER"
      - "ADMIN"

хотетьиспользовать@ConfigurationProperties bean,Можно вводить так же, как и любой другой боб.,нравиться Внизпример所示:

Язык кода:javascript
копировать
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зарегистрироватьсясередина,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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:

Язык кода:javascript
копировать
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>:

Язык кода:javascript
копировать
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объект列表:

Язык кода:javascript
копировать
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;
    }

}

Его можно настроить следующим образом:

Язык кода:javascript
копировать
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.,Проекты также не будут объединены.

Если список указан в нескольких профилях, «Воляиспользовать» имеет приоритет над самым высоким из профилей (и исполь зовать только для этого профиля).

Язык кода:javascript
копировать
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>свойство.

Язык кода:javascript
копировать
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;
    }

}

Следующий пример конфигурации:

Язык кода:javascript
копировать
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Формат
  • Более читаемый формат,Где значение и единица измерения связаны (10 с означает 10 Второй)
Язык кода:javascript
копировать
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Можетк Вниз列任意формаобозначение:500PT0.5Sи500ms

Вы также можете использовать любой поддерживаемый модуль:

  • ns наносекунда
  • us микросекунды
  • ms миллисекунда
  • s Второй
  • m точка
  • h Час
  • d небо

Единица по умолчанию — миллисекунда.,Можетиспользовать@DurationUnitпереписать,нравитьсяначальство面из Пример所示。

еслиты喜欢использовать Привязка конструктора,Может ли организованный то же самое из атрибута,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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
  • Более простой формат,где пара значения и единицы — это связь из (1y3d означает 1Год3небо)

Простой формат поддерживает следующие единицы:

  • y Год
  • m луна
  • w неделя
  • d небо

Тип java.time.Period на самом деле никогда не хранит номер недели, это сокращение, означающее «7небо»из.

Преобразование размеров данных

Spring Framework имеет тип значения DataSize, который представляет размер в байтах.,еслитыхотетьобщественныйDataSize,Можно использовать следующие форматы:

  • в целомдаlongФормат,по умолчаниюиспользоватьbytes,除非обозначение Понятно@DataSizeUnit
  • Более читаемый формат,Где значение и единица измерения связаны (10 МБ означает 10 мегабайт)

Пример:

Язык кода:javascript
копировать
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 bytes
  • KB kilobytes
  • MB megabytes
  • GB gigabytes
  • TB terabytes

Единица измерения по умолчанию — байты.,Может быть переопределено @DataSizeUnit,нравитьсяначальство面из Пример所示。

еслиты喜欢использовать Привязка конструктора,Может ли организованный то же самое из атрибута,нравитьсяк Вниз Пример所示:

Язык кода:javascript
копировать
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

когда@ConfigurationPropertiesдобрый被Springиз@Validatedаннотация Комментарийчас,Spring Boot попытается их проверить. Вы можете напрямую связаться с нами по адресу Класс конфигурацииначальствоиспользоватьJSR-303 javax.validation约束Комментарий。хотеть做приезжатьэтот一点,Убедитесь, что в вашем пути к классам есть совместимая реализация JSR-303.,Затем добавьте аннотацию ограничений к полям,нравиться Внизпример所示:

Язык кода:javascript
копировать
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:

Язык кода:javascript
копировать
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. Готовые к производству функции)».

@ConfigurationProperties vs. @Value

@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использовать.

5.3 Profiles

Пружинные профили позволяют изолировать точки конфигурации приложения.,使Чтотолькосуществоватьидентификация环境середина Доступный。любой@Component@Configurationили@ConfigurationProperties都Может用@Profileотметка加к限制,нравиться Внизпример所示:

Язык кода:javascript
копировать
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,нравиться Внизпример所示:

Язык кода:javascript
копировать
spring.profiles.active=dev,hsqldb

также Можетиспользоватьк Внизоткрыть关существовать Заказ行начальствообозначениеэто:--spring.profiles.active=dev,hsqldb

если профиль не активирован,Файл конфигурации по умолчанию включен. Профиль по умолчанию — имя по умолчанию.,Можетиспользоватьspring.profile.default Свойства среды настраивают его, как показано в следующем примере:

Язык кода:javascript
копировать
spring.profiles.default=none

spring.profiles.activeиspring.profiles.defaultможет толькосуществовать非Конфигурациядокументидентификацияиздокументсерединаиспользовать。этот意味着они Нет能Сумка Содержитсуществоватьspring.config.activate.on-profileактивацияизконкретный профильиздокументилиАктивировать свойствасередина。

Например, следующая конфигурация недействительна:

Язык кода:javascript
копировать
# this document is valid
spring.profiles.active=prod
#---
# this document is invalid
spring.config.activate.on-profile=prod
spring.profiles.active=metrics

5.3.1 Добавить профиль активности

spring.profiles.activeсвойство遵循идругойсвойствотакой жеиз排序规но。PropertySourceвысший приоритет,этот意味着ты Можетсуществоватьapplication.propertiesсерединаобозначение活动Конфигурациядокумент,Затемиспользовать Заказ行открыть关替换они。

иногда,Воля Конфигурациядобавить вприезжать活动Конфигурациядокументвместо того, чтобы заменить ихда很有用из。spring.profiles.includeсвойство Доступный于существоватьspring.profiles.activeсвойствоактивацияиз Конфигурациядокумент之начальство Добавить профиль активности。

Точка входа SpringApplication также имеет дополнительные файлы конфигурации для настройки Java. API,пожалуйста参阅SpringApplicationсерединаизsetAdditionalProfiles()метод。

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

Язык кода:javascript
копировать
spring.profiles.include[0]=common
spring.profiles.include[1]=local

иspring.profile.active аналогичен,spring.profile.includeможет толькоиспользуется для非Конфигурациядокументидентификацияиздокумент。

Если данное из профиля активное состояние, вы также можете использовать Профильную группа (предлагается в следующем разделе) Добавить активность из профиля.

5.3.2 Группа файлов конфигурации

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

Чтобы добиться этого, Spring Boot позволяет определить Профильную группа。Профильная группа позволяет определить связанную Профильную группаизлогикаимя。

Например,нас Может创建один Зависит отprodbиprodmqПрофильная группа становитьсяиз продюсерской группы.

Язык кода:javascript
копировать
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq

насизприложение现существовать Можетиспользовать--spring.profiles.active=productionзапускать,Активируйте файлы конфигурации производства и proddbиprodmq один раз.

5.3.3 Программная настройка файлов конфигурации

ты Можетсуществоватьприложениебегать ДопроходитьвызовSpringApplication.setAdditionalProfiles(...),возвращаться МожетиспользоватьSpringизConfigurationEnvironmentинтерфейсактивация Конфигурациядокумент。

5.3.4 Укажите файл конфигурации

application.properties(илиapplication.yml)ипроходить@ConfigurationPropertiesЦитироватьиздокументизконкретный профильиз Варианты都被视длядокументи被нагрузка。有关Подробности,пожалуйста参阅“Файлы, специфичные для профиля”。

Последующие главы не завершены и нуждаются в дополнении.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose