Предварительное исследование принципа автоматической сборки SpringBoot

Spring Boot

предисловие

Spring переводится с китайского как «весна». Действительно, на какое-то время он принес весну Java-разработчикам, но по мере расширения масштаба нашего проекта Spring нужно настраивать во все большем количестве мест, это преувеличение. сказать: «Два часа на настройку, пять минут на кодирование». Такая сложная XML-конфигурация постепенно уйдет с исторической сцены по мере развития индустрии программного обеспечения шаг за шагом.

Введение в SpringBoot

Из: Энциклопедия Baidu Spring Boot — это новая платформа, предоставленная командой Pivotal, предназначенная для упрощения первоначальной настройки и разработки новых приложений Spring. Фреймворк использует особый способ настройки, поэтому разработчикам больше не нужно определять шаблонную конфигурацию. Таким образом, Spring Boot стремится стать лидером в развивающейся области быстрой разработки приложений.

Особенности SpringBoot:

(1) Можно создать независимыйSpringприложения и на основе их подключаемых модулей Maven или Gradle могут создавать исполняемые файлы JAR и WAR;

(2) встроенные контейнеры сервлетов, такие как Tomcat или Jetty;

(3) Обеспечьте автоматически настроенную «стартовую» объектную модель проекта (POMS) для упрощенияMavenнастроить;

(4) Максимально возможно автоматически настроить контейнер Spring;

(5) предоставлять препаративные функции, такие как показатели, проверки здоровья и экстернализация;

(6) Абсолютно не требуется генерация кода, не требуется настройка XML.

собственное понимание:

SpringBoot, как следует из названия, создает впечатление, что это такой проект, начатый Spring. В прошлом, когда мы хотели запустить проект Spring, нам часто приходилось настраивать множество файлов конфигурации xml, но после использования SpringBoot мы можем запустить весь проект напрямую, не записывая строку xml, что сокращает «нулевую конфигурацию». ». От разработчиков требуется много работы, что позволяет разработчикам сосредоточиться на разработке бизнес-логики, делая логику проекта более полной. Кроме того, он принимает стиль конфигурации JavaConfig, а метод импорта компонентов также изменен с исходной прямой конфигурации на @EnableXXXX.Эта конфигурация чистого кода Java и метод импорта компонентов делают код более элегантным, поэтому предпочтение отдается SpringBoot. компаниями, большими и малыми, и большинством программистов в наши дни, не без причины.

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

Из коробки:В процессе разработки добавьте соответствующие пакеты зависимостей в файл pom проекта maven, а затем замените громоздкую конфигурацию XML соответствующими аннотациями для управления жизненным циклом объектов..

Соглашение больше, чем конфигурация:Целевая структура настраивается самой SpringBoot и парадигмой разработки программного обеспечения, в которой разработчик добавляет информацию в структуру. Хотя эта функция несколько снижает гибкость и усложняет поиск ошибок, она сокращает количество решений, которые должны принимать разработчики, сокращает количество XML-конфигураций и автоматизирует компиляцию, тестирование и упаковку кода.

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

Нестандартные принципы

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

  • Опыт из коробки

    SpringBoot предоставляет нам место для быстрого создания проекта SpringBoot:start.spring.io/

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

    官网生成

    Нам нужно только заполнить вышеуказанную информацию, нажать «Создать», вы можете напрямую загрузить проект SpringBoot, а затем импортировать его в нашу IDE, Eclipse или IDEA, а затем запустить его напрямую.

    Полная структура проекта:

    全项目结构

    запускать:

    项目启动

    доступ:http://localhost:8080/

    启动成功

    Представляет успешный запуск всего проекта SpringBoot.

  • Анализ принципа вне коробки

    • Контрастная конфигурация SSM

      По сути, в вышеизложенном из коробки мы эквивалентны внедрению компонента SpringMVC, но, как видите, мы запустили проект без какой-либо настройки. С другой стороны, глядя на конфигурацию SpringMVC фреймворка SSM в прошлом, у меня есть копия, которую вы можете сравнить.

      spring-web.xml:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
      	xmlns:mvc="http://www.springframework.org/schema/mvc"
      	xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
      	<!-- 配置SpringMVC -->
      	<!-- 1.开启SpringMVC注解模式 -->
      	<!-- 简化配置: (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter 
      		(2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持 -->
      	<mvc:annotation-driven />
      
      	<!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 -->
      	<mvc:resources mapping="/resources/**" location="/resources/" />
      	<mvc:default-servlet-handler />
      
      	<!-- 3.定义视图解析器 -->
      	<bean id="viewResolver"
      		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      		<property name="prefix" value="/WEB-INF/html/"></property>
      		<property name="suffix" value=".html"></property>
      	</bean>
      	<!-- 文件上传解析器 -->
      	<bean id="multipartResolver"
      		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      		<property name="defaultEncoding" value="utf-8"></property>
      		<property name="maxUploadSize" value="10485760000"></property><!-- 最大上传文件大小 -->
      		<property name="maxInMemorySize" value="20971520"></property>
      	</bean>
      	<!-- 在spring-mvc.xml文件中加入这段配置后,spring返回给页面的都是utf-8编码了 -->
      	<bean
      		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      		<property name="messageConverters">
      			<list>
      				<bean
      					class="org.springframework.http.converter.StringHttpMessageConverter">
      					<property name="supportedMediaTypes">
      						<list>
      							<value>text/html;charset=UTF-8</value>
      						</list>
      					</property>
      				</bean>
      			</list>
      		</property>
      	</bean>
      	<!-- 4.扫描web相关的bean -->
      	<context:component-scan base-package="com.SchoolShop.o2o.web" />
      	<!-- 5.权限拦截器 -->
      </beans>
      

      web.xml:

      <servlet>
        	<servlet-name>spring-dispatcher</servlet-name>
        	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        	<init-param>
        		<param-name>contextConfigLocation</param-name>
        		<param-value>classpath:spring/spring-*.xml</param-value>
        	</init-param>
        </servlet>
        <servlet-mapping>
        	<servlet-name>spring-dispatcher</servlet-name>
        	<!-- 默认匹配所有请求 -->
        	<url-pattern>/</url-pattern>
        </servlet-mapping>
      

      Как видите, здесь нужно настроить два файла, web.xml и spring-web.xml, можно сказать, что конфигурация достаточно сложная.

      По сравнению с этим использование SpringBoot «из коробки» очень удобно, поэтому остановимся на принципе использования SpringBoot «из коробки».

    • Начните с pom.xml

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

      <parent>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-parent</artifactId>
      	<version>2.2.1.RELEASE</version>
      	<relativePath/> <!-- lookup parent from repository -->
      </parent>
      

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

      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>2.2.1.RELEASE</version>
          <relativePath>../../spring-boot-dependencies</relativePath>
      </parent>
      

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

      父依赖

      父依赖包含

      Итак, мы можем сделать первый вывод:

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

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

      <resources>
            <resource>
              <filtering>true</filtering>
              <directory>${basedir}/src/main/resources</directory>
              <includes>
                  <!-- 可以读取的配置文件有
      				application.yml/application.yaml/application.properties
       			-->
                <include>**/application*.yml</include>
                <include>**/application*.yaml</include>
                <include>**/application*.properties</include>
              </includes>
            </resource>
            <resource>
              <directory>${basedir}/src/main/resources</directory>
              <excludes>
                <exclude>**/application*.yml</exclude>
                <exclude>**/application*.yaml</exclude>
                <exclude>**/application*.properties</exclude>
              </excludes>
            </resource>
      </resources>
      
    • Пусковая установка

      <dependency>
      	<groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
          <version>2.2.1.RELEASE</version>
      </dependency>
      

      Стартер — это сцена запуска SpringBoot.Например, если мы хотим использовать веб-связанный, то мы можем напрямую импортировать spring-boot-starter-web, тогда это поможет нам автоматически импортировать все необходимые зависимости в веб-окружении.

      Давайте посмотрим, что хранится в лаунчере:

      Возьмем, к примеру, spring-boot-starter:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.2.1.RELEASE</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.2.1.RELEASE</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <version>2.2.1.RELEASE</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>1.3.5</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.1.RELEASE</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.25</version>
            <scope>runtime</scope>
          </dependency>
      

      хранится в немЗависимости, связанные с автоматической настройкой, зависимости, связанные с ведением журнала, и Spring-coreПодождите зависимости, Нам нужно импортировать только один spring-boot-starter, чтобы импортировать все эти зависимости напрямую, а не импортировать их по одной, как раньше.

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

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

      Получите документацию по лаунчеру:docs.spring.IO/весенняя загрузка…

    • основная программа (важно)

      //@SpringBootApplication 标注,是一个SpringBoot应用
      @SpringBootApplication
      public class SpringbootdemoApplication {
      	public static void main(String[] args) {
      		SpringApplication.run(SpringbootdemoApplication.class, args);
      	}
      }
      

      При написании проекта SpringBoot всегда приходится писать такую ​​основную программу.Самая большая особенность этой основной программы заключается в том, что на ее класс помещается аннотация @SpringBootApplication, которая является ядром запуска проекта SpringBoot и объектом нашего исследования. .

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

      Нажмите на @SpringBootApplication, и вы обнаружите, что это комбинированная аннотация, в основном состоящая из нескольких аннотаций.

      @SpringBootConfiguration//核心
      @EnableAutoConfiguration//核心
      @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
      

      Первое, что нам нужно изучить, это две основные аннотации.@SpringBootConfigurationИ **@EnableAutoConfiguration**, проанализируйте один за другим.

      1. @SpringBootConfiguration

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Configuration
        public @interface SpringBootConfiguration {
        }
        

        Вы можете видеть, что SpringBootConfiguration на самом деле содержит аннотацию @Configuration, с которой мы все слишком хорошо знакомы, что означает, что он является классом конфигурации Spring. Итак, мы можем думать, что:@SpringBootConfiguration = @Configuration

      2. @EnableAutoConfiguration

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

        @AutoConfigurationPackage //自动配置包
        @Import(AutoConfigurationImportSelector.class)//自动配置导入选择
        

        Давайте посмотрим на содержимое @Import(AutoConfigurationImportSelector.class):

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

        /*
          所有的配置都存放在configurations中,
          而这些配置都从getCandidateConfiguration中获取,
          这个方法是用来获取候选的配置。
        */
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        
        

        getCandidateConfigurations():

        Этот метод можно использовать дляПолучить все возможные конфигурации, так откуда взялись эти конфигурации-кандидаты?

        /*获取候选的配置*/
        protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
        				getBeanClassLoader());
        		Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
        				+ "are using a custom packaging, make sure that file is correct.");
        		return configurations;
        	}
        

        На самом деле он возвращает список, созданныйloadFactoryNames() возвращает метод, который проходит в getSpringFactoriesLoaderFactoryClass(), мы можем посмотреть содержимое этого метода.

        protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        	return EnableAutoConfiguration.class;
        }
        

        Мы видели знакомое слово -EnableAutoConfiguration, то есть фактически возвращает все пакеты, аннотированные этим классом. Разве пакет не помечен этим классом @SpringBootApplication?

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

        Посмотрим вниз, а в нем есть такое высказывание, которое является утверждением:

        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
        				+ "are using a custom packaging, make sure that file is correct.");
        

        Это утверждение означает,Конфигурации должны быть не пустыми, иначе выведите абзац,No auto configuration classes found in META-INF/spring.factories, давайте подумаем об этой логике в обратном порядке. Если эта коллекция не пуста, значит ли это, что spring.factories найден и содержимое этого файла будет загружено?

        Имея в виду этот вопрос, мы сначала находим файл spring.factories:

        找到核心文件

        Вы можете видеть, что он содержит множество свойств автоматической конфигурации:

        文件内容

        Мы можем найти точку автоматической настройки и войти, напримерWebMvcAutoConfiguration:

        自动配置类

        Вот вся конфигурация WebMvc, напримервид распознавателя,глобализацияи Т. Д.

      Анализируя здесь, мы можемсделать полный выводв настоящее время:

      Когда наш проект SpringBoot запустится, сначала будет импортирован AutoConfigurationImportSelector. Этот класс поможет нам выбрать все конфигурации-кандидаты. Конфигурации, которые нам нужно импортировать, — это все классы конфигурации, написанные SpringBoot для нас, поэтому расположение этих классов конфигурации существует в META -INF/spring.factories, через этот файл Spring может найти расположение этих классов конфигурации, поэтому он загружает конфигурацию.

      结论1流程

      Увидев это, у некоторых учащихся могут возникнуть сомнения.В spring.factories так много конфигураций, они полностью загружаются при каждом запуске?? Это явно нереально.

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

      判断注解

      @ConditionalOnXXX: этот класс вступит в силу только в том случае, если будут выполнены все условия.

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

      Так и достигается: добавляем стартер статера в файл pom.xml, и SpringBoot настраивает его автоматически. Заканчиватьиз коробки.

    • в заключении

      Все классы автоконфигурации SpringBoot сканируются и загружаются при запуске.Путь к классу автоконфигурации можно узнать через spring.factories, но загружаются не все конфигурации, которые есть в spring и factorys, а через аннотацию @ConditionalOnClass. установлено ли условие (пока соответствующий статер импортирован, условие может быть установлено), если условие установлено, класс конфигурации загружается, в противном случае класс конфигурации не загружается.

      Вот процесс, который, я думаю, легче понять:

      1. SpringBoot получает значение, указанное на EnableautoconFiggation от Meta-Inf / Spring. Ifactories в классе при запуске

      2. Импортируйте эти значения в контейнер как классы автоматической настройки, и классы автоматической настройки вступят в силу, помогая нам с автоматической настройкой;

      3. В прошлом нам приходилось настраивать что-то самостоятельно, и классы автоматической настройки помогали нам решать эти проблемы.

      4. Общее решение и автоматическая настройка всего J2EE находятся в jar-пакете springboot-autoconfigure;

      5. Он вернет все компоненты, которые необходимо импортировать, в виде полных имен классов, и эти компоненты будут добавлены в контейнер;

      6. Он будет импортировать в контейнер множество классов автоматической настройки (xxxAutoConfiguration), то есть импортировать в контейнер все компоненты, необходимые для этой сцены, и настраивать эти компоненты;

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

        Взято с https://blog.kuangstudy.com/index.php/archives/630/

      最终结论流程

соглашение о конфигурации

После того, как готовый принцип закончен, легче понять, что соглашение больше, чем конфигурация. На самом деле соглашение о настройке — это детали автоматической настройки из коробки. Конкретно:В каком каталоге должен быть размещен наш файл конфигурации (.yml),Соглашение об именах файлов конфигурации,Bean-компоненты сканируются при запуске проекта,Как выглядит конфигурация компонента по умолчанию (например, преобразователь представлений SpringMVC)Подождите, подождите и т. д. Этот ряд вещей можно назватьсоглашение, давайте немного поговорим об «условностях» в SpringBoot.

  • Соглашения для структуры каталогов maven

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

    Config locations are searched in reverse order. By default, the configured locations are classpath:/,classpath:/config/,file:./,file:./config/. The resulting search order is the following:

    1. file:./config/
    2. file:./
    3. classpath:/config/
    4. classpath:/

    То есть каталог файла конфигурации Spring может быть помещен в

    1. /config
    2. /(Корневая директория)
    3. resource/config/
    4. resource/

    Эти четыре пути имеют отношение приоритета сверху вниз.

  • Соглашения для файлов конфигурации SpringBoot по умолчанию

    SpringBoot по умолчанию может загружать три файла конфигурации:

    1. application.yml
    2. application.yaml
    3. application.properties

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

  • Соглашения по сканированию областей пакета при запуске проекта

    Правило по умолчанию для сканирования аннотаций SpringBoot — это пакет и его подпакеты, в которых находится класс входа SpringBoot.

    Если пакет, в котором находится класс входа, называется cn.objectspace.demo, областью действия пакета автоматического сканирования является пакет cn.objectspace.demo и его подпакеты.Если пакет службы и пакет dao не входят в эту область, автоматическое сканирование выполняться не будет.

Как класс автоконфигурации SpringBoot читает конфигурацию yml

  • Более подробное понимание автоконфигурации

    Выше мы объяснили некоторые принципы автоматической настройки SpringBoot и рассмотрим весь процесс автоматической настройки с глобальной точки зрения. Например, где начать процесс сборки, как найти собранный пакет и т. д.

    Итак, теперь давайте приблизим нашу точку зрения к SpringBoot и поговорим о том, как вещи, которые мы настраиваем в application.yml, настраиваются в классах конфигурации один за другим.

  • Эти вещи могут быть настроены в файле конфигурации YML

    Прежде всего, чтобы узнать ответ на этот вопрос, мы должны привыкнуть к конфигурации Springboot. Выше мы объяснили, что SpringBoot всегда представляет все конфигурации в виде JavaConfig, что может сделать код более элегантным. Тогда вещи, настроенные в yml, должны быть связаны с этим режимом конфигурации.Обычно некоторые свойства, существующие в классе автоконфигурации, то как эти классы автоконфигурации обнаруживаются при запуске? Если вы помните описание выше, то вы можете четко знать: spring.factories! Правильно, вот и все, так что у нас, кажется, есть ответ на этот вопрос -Пока он существует в spring.factories, мы можем настроить его в application.yml.. Конечно, это не значит, что мы не можем настроить его, если он не существует.Мы можем настроить эти классы конфигурации.Пока мы пишем класс конфигурации, мы можем настроить нужные нам значения атрибутов в yml , а затем настроить. Файл конфигурации считывается непосредственно в классе и сопоставляется со свойствами класса конфигурации. Итак, вот наш вопрос:Как класс конфигурации считывает информацию в файле конфигурации yml?

  • @ConfigurationProperties

    Чтобы понять проблему. Нам сначала нужно понять, какую роль этот комментарий.

    Мы можем попробовать сами определить некоторые свойства в application.yml следующим образом:

    object: 
      name: Object
      blogurl: blog.objectspace.cn
    

    Теперь мы сами определяем класс для чтения этого файла:

    @Component
    @ConfigurationProperties(prefix = "object")
    public class TestConfig {
    	private String name;
    	private String blogUrl;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getBlogUrl() {
    		return blogUrl;
    	}
    	public void setBlogUrl(String blogUrl) {
    		this.blogUrl = blogUrl;
    	}
    }
    

    Затем мы выводим этот объект в тестовом классе:

    @SpringBootTest
    class SpringbootdemoApplicationTests {
    	@Autowired
    	TestConfig testConfig;
    	@Test
    	void contextLoads() {
    		System.out.println(testConfig.getName());
    		System.out.println(testConfig.getBlogUrl());
    	}
    
    }
    

    Результаты теста:

    配置注入

    Мы видим, что значения свойств, которые мы настроили в yml, выводятся в консоль, но эти значения нигде явно не внедряются в этот объект.

    Так что аннотация @ConfigurationProperties может внедрить значения, записанные в yml-файле, в свойства нашего класса.

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

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

    mvcproperties

    Щелкните любой класс *Properties и просмотрите его содержимое:

    mvc配置注入

    Увидев это, я думаю, все поняли, давайте возьмем в качестве примера конфигурацию mvc.

    yml演示

    Формат даты, который мы настраиваем в yml, можно сопоставить с dateFormat в классе через @ConfigurationProperties, а затем настроить эти свойства в классе конфигурации через класс автоматической настройки.

Эпилог

Приглашаю всех посетить мой личный блог:Object's Blog