Spring Boot (1) — быстрый старт и принципиальный анализ

Spring Boot Java EE
Spring Boot (1) — быстрый старт и принципиальный анализ

Это 16-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

1. Реализация кода

1. Создайте проект maven, обычный java-проект

2. Добавьте начальные зависимости SpringBoot

SpringBoot требует, чтобы проект наследовал стартовые зависимости SpringBoot spring-boot-starter-parent

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.0.1.RELEASE</version>
     </parent>

SpringBoot необходимо интегрировать SpringMVC для разработки контроллера, поэтому проекту необходимо импортировать зависимости веб-запуска.

     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
     </dependencies>

3. Напишите класс начальной загрузки SpringBoot

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

 package com.xiaojian;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 ​
 @SpringBootApplication
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class);
     }
 ​
 }

4. Напишите класс контроллера

 package com.xiaojian.controller;
 ​
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 ​
 @Controller
 public class QuickController {
 ​
     @RequestMapping("/quick")
     @ResponseBody
     public String quick(){
         return "hello SpringBoot";
     }
 }

Необходимо добавить @ResponseBody.

5. Тест

Доступ к браузеру: localhost:8080/быстрое отображение: привет, SpringBoot

Во-вторых, входной анализ

1. Анализ кода SpringBoot

  1. Во всех проектах SpringBoog зависимости родительского проекта (spring-boot-starter-parent) должны быть добавлены в pom.xml с последующим анализом исходного кода.
  2. Возьмите функцию как единое целое, если вам нужно, чтобы веб-функция была доступна в браузере, добавьте зависимости по порядку (spring-boot-starter-web)
  3. @SpringBootApplication, объявите, что этот класс является загрузочным классом SpringBoot. Метод run запускает загрузочный класс SpringBoot, а параметр является объектом байт-кода загрузочного класса.
 @SpringBootApplication
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class);
     }
 }

2. Горячее развертывание проекта Spring Boot (хорошо)

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

 <!--热部署配置-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
 </dependency>

ps: решение IDEA для отказа горячего развертывания SpringBoot

  1. Setting -> Compiler -> Build project automatically
  2. Затем Shift+Ctrl+Alt+/, выберите Registry, найдите в спискеcompile.automatically.allow.when.app.running и отметьте Finish.

3. Принципиальный анализ

1. Разбор принципа запуска зависимостей (см. исходный код)

  • Проанализируйте spring-boot-starter-parent

    • Также есть родительские зависимости spring-boot-starter-dependencies в spring-boot-starter-parent, из которых видно, что определена версия, управление зависимостями и управление плагинами некоторых координат, поэтому наш проект SpringBoot наследует spring-boot-starter-parent После этого у него уже есть такая конфигурация, как блокировка версии.Таким образом, роль запуска зависимостей заключается в переносе зависимостей.
  • Анализировать spring-boot-starter-web

    • spring-boot-starter-web должен «упаковать» координаты spring-web, spring-webmvc и т. д., которые будут использоваться в веб-разработке, чтобы наш проект мог запускать веб, пока координаты spring-boot-starter -Введены веб-зависимости запуска.Разработано, также отражает роль переноса зависимостей. То же самое относится и к функциям, которые необходимо добавить в будущем.

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

Аннотация @SpringBootApplicationЭквивалентно настройке трех аннотаций

 @SpringBootConfiguration // 相当于 @Configuration ,配置Spring容器(@Bean,注册bean对象,标注在返回某个实例的方法)
 @EnableAutoConfiguration // 自动配置
 @ComponentScan( // 组件扫描,扫描与引导类同级目录包下的bean
     excludeFilters = {@Filter(
     type = FilterType.CUSTOM,
     classes = {TypeExcludeFilter.class}
 ), @Filter(
     type = FilterType.CUSTOM,
     classes = {AutoConfigurationExcludeFilter.class}
 )}
 )

Интерфейс EnableAutoConfiguration(важный)

20200717161600

@AutoConfigurationPackage

image-20200717163939015

Сканировать пакет в каталоге того же уровня основного класса конфигурации (класс, отмеченный @SpringBootApplication) и все компоненты во всех следующих подпакетах в контейнер Spring

image-20200717164031337

@Импортировать аннотацию:

Добавьте экземпляр в контейнер springIOC, импортировав

20200710142953

AutoConfigurationImportSelector:

Селектор компонентов для импорта

Все компоненты, которые необходимо импортировать, возвращаются как полные имена классов, эти компоненты добавляются в контейнер.

В контейнер будет импортировано множество классов автоматической конфигурации (xxxAutoConfiguration);

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

В методе получения полного имени класса в этом классе вызовитеgetCandidateConfigurations( ... )

image-20200803143353048

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

image-20200803144045379

Целевое местоположение

image-20200803144309171

Схема всего процесса автоматического импорта компонентов:

Когда SpringBoot запускается, он получает значение, указанное EnableAutoConfiguration (полное имя класса компонента) из META-INF/spring.factories по пути к классам пакета autoconfigure springboot, и импортирует эти значения в контейнер как классы автоматической настройки для автоматическая настройка. Класс вступает в силу и помогает нам выполнять работу по автоматической настройке.

До того, как нам пришлось настраивать что-то самостоятельно, в этом нам помогал класс автоматической настройки (сравните основные свойства конфигурации в SSM).

SpringBoot自动配置原理

В-четвертых, структура каталогов проекта SpringBoot

папка ресурсов

  • static: сохранить все статические ресурсы, js, css, изображения;
  • шаблоны: сохранить все страницы шаблонов; (Jar-пакет Spring Boot по умолчанию использует встроенный Tomcat, по умолчанию не поддерживает jsp-страницы), вы можете использовать механизмы шаблонов (freemarker, thymeleaf)
  • application.properties: файл конфигурации приложения Spring Boot;