Если вы только приступаете к работе со Spring Boot или "Spring" в целом,начните с ознакомления с этим разделом. Он даст ответы на основные вопросы "что?", "как?" и "зачем?". Раздел содержит введение в Spring Boot вместе с инструкциями по установке. Затем мы проведем вас через создание первого приложения в Spring Boot, описывая по ходу некоторые основные принципы.

Введение в Spring Boot

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

Вы можете использовать Spring Boot для создания Java-приложений, которые могут быть запущены с помощью команды java -jar или более традиционных методов развертываний через war-файлы. Мы также предоставляем инструментальное средство командной строки, которое запускает "скрипты Spring".

Нашими основными целями является:

  • Обеспечить радикально более быстрый и широко доступный опыт начальной работы для любых разработок на Spring.

  • Предлагать собственное мнение с самого начала, но уступать, если требования начинают расходиться со стандартными.

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

  • Абсолютное отсутствие генерации кода и требований к XML-конфигурации.

Разработка вашего первого приложения средствами Spring Boot

В этом разделе описывается разработка небольшого веб-приложения "Hello World!", которое демонстрирует некоторые ключевые возможности Spring Boot. Для сборки этого проекта мы используем Maven, поскольку большинство IDE поддерживают его.

Веб-сайт spring.io содержит множество гайдов по "началу работы", в которых используется Spring Boot. Если вам потребуется решить конкретную проблему, сначала загляните туда.

Вы можете пропустить приведенные ниже шаги, перейдя по адресу start.spring.io и выбрав стартовый паке для веб из поисковика зависимостей. При этом будет создана новая структура проекта, чтобы можно было сразу же приступать к написанию кода.p>

Прежде чем мы приступим, откройте терминал и выполните следующие команды, чтобы удостовериться, что у вас установлены действительные версии Java и Maven:

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
$ mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_102, vendor: Oracle Corporation
Этот образец должен быть создан в собственном каталоге. Последующие инструкции предполагают, что вы уже создали подходящий каталог и что он является вашим текущим каталогом.

Создание POM

Начать необходимо с создания файла pom.xml для Maven. pom.xml – это набор правил, который используется для сборки проекта. Откройте ваш любимый текстовый редактор и добавьте следующее:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
    </parent>
    <!-- Дополнительные строки будут добавлены здесь... -->
</project>

Предыдущий листинг должен позволить вам получить рабочий билд. Вы можете проверить его, запустив mvn package (пока что можно игнорировать предупреждение "jar будет пуст – отсутствует содержимое, помеченное для включения!").

На этом этапе можно импортировать проект в IDE (большинство современных Java IDE предусматривают встроенную поддержку Maven). Для упрощения в этом примере мы продолжаем использовать обычный текстовый редактор.

Добавление зависимостей из classpath

Spring Boot предусматривает ряд "стартовых пакетов", которые позволяют добавлять jar-файлы в classpath. Наши приложения для дымовых (на общую работоспособность) тестов (smoke tests) используют spring-boot-starter-parent в parent секции POM-модели. spring-boot-starter-parent – это специальный стартовый пакет, который предусматривает используемые параметры Maven по умолчанию. Он также предусматривает секцию управления зависимостями, чтобы можно было опускать теги version для "избранных" зависимостей.

Другие "стартовые пакеты" предусматривают зависимости, которые, скорее всего, понадобятся при разработке приложений определенного типа. Поскольку мы разрабатываем веб-приложение, то добавляем зависимость от spring-boot-starter-web. Перед этим можно взглянуть, что у нас имеется на данный момент, выполнив следующую команду:

$ mvn dependency:tree
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT

Команда mvn dependency:tree выводит древовидное представление зависимостей проекта. Как можно заметить, spring-boot-starter-parent сам по себе не предусматривает никаких зависимостей. Чтобы добавить необходимые зависимости, отредактируйте свой pom.xml и добавьте зависимость spring-boot-starter-web сразу под parent секцией:

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

Если вы снова запустите mvn dependency:tree, то увидите, что теперь существует несколько дополнительных зависимостей, включая веб-сервер Tomcat и сам Spring Boot.

Написание кода

Чтобы завершить приложение, нам необходимо создать один Java-файл. По умолчанию Maven компилирует исходники из каталога src/main/java, поэтому необходимо создать эту структуру каталога, а затем добавить файл с именем src/main/java/MyApplication.java, который будет содержать следующий код:

Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
public class MyApplication {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
Kotlin
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@EnableAutoConfiguration
class MyApplication {
    @RequestMapping("/")
    fun home() = "Hello World!"
}
fun main(args: Array<String>) {
    runApplication<MyApplication>(*args)
}

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

Аннотации @RestController и @RequestMapping

Первая аннотация для нашего класса MyApplication – это @RestController. Она известнка как стереотипная аннотация. Данная аннотация служит подсказкой для людей, читающих код, и для Spring, что класс играет определенную роль. В данном случае наш класс является @Controller для веб, поэтому Spring учитывает его при обработке входящих веб-запросов.

Аннотация @RequestMapping передает информацию о "маршрутизации". Она сообщает Spring, что любой HTTP-запрос с путем / следует отображать на метод home. Аннотация @RestController сообщает Spring, что необходимо вывести результирующую строку обратно непосредственно вызывающей программе.

Аннотации @RestController и @RequestMapping являются аннотациями Spring MVC (они не характерны для Spring Boot).

Аннотация @EnableAutoConfiguration

Вторая аннотация на уровне класса – это @EnableAutoConfiguration. Эта аннотация сообщает Spring Boot, что необходимо "угадать", как нужно сконфигурировать Spring, основываясь на добавленных вами jar-зависимостях. Поскольку spring-boot-starter-web добавил Tomcat и Spring MVC, средство автоконфигурирования предполагает, что вы разрабатываете веб-приложение, и настраивает Spring соответствующим образом.

Стартовые пакеты и автоконфигурация

Автоконфигурация предназначена для работы со "стартовыми пакетами", но эти два понятия не связаны напрямую. Вы можете свободно выбирать jar-зависимости вне стартовых пакетов. Spring Boot по-прежнему будет предпринимать все возможное для автоконфигурирования вашего приложения.

Метод "main"

Заключительной частью нашего приложения является метод main. Это стандатный метод, который соответствует стандарту Java для точки входа в приложение. Наш метод main делегирует полномочия классу SpringApplication для Spring Boot, вызывая run. SpringApplication осуществляет начальную загрузку нашего приложения, запуская Spring, который, в свою очередь, запускает автоматически сконфигурированный веб-сервер Tomcat. Нам необходимо передать MyApplication.class в качестве аргумента в метод run, чтобы сообщить SpringApplication, какой компонент Spring является первичным. Массив args также передается для открытия любых аргументов командной строки.

Выполняем пример

На этом этапе приложение уже должно работать. Поскольку вы использовали POM-модель со spring-boot-starter-parent, у вас имеется цель run, которую можно использовать для запуска приложения. Вводим mvn spring-boot:run из корневого каталога проекта, чтобы запустить приложение. Вы должны увидеть вывод, подобный следующему:

$ mvn spring-boot:run
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.7.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 2.222 seconds (JVM running for 6.514)

Если вы откроете веб-браузер на localhost:8080, то увидите следующее сообщение:

Hello World!

Чтобы поэтапно выйти из приложения, нажмите ctrl-c.

Создание исполняемого jar-файла

Мы завершаем наш пример созданием полностью самодостаточного исполняемого jar-файла, который можно выполнять в производственном окружении. Исполняемые jar-файлы (иногда называемые "fat (толстыми) jar-файлами") – это архивы, содержащие скомпилированные классы вместе со всеми jar-зависимостями, которые необходимы коду для выполнения.

Исполняемые jar-файлы и Java

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

Чтобы решить эту проблему, многие разработчики используют "uber (убер)" jar-файлы. В uber jar-файл все классы из всех зависимостей приложения упакованы в один архив. Проблема такого подхода заключается в том, что становится трудно понять, какие именно библиотеки находятся в приложении. Также может возникнуть проблема, если одно и то же имя файла используется (но с разным содержимым) в нескольких jar-файлах.

Spring Boot использует другой подход и позволяет вложить jar-файлы напрямую.

Чтобы создать исполняемый jar-файл, необходимо добавить spring-boot-maven-plugin в наш pom.xml. Для этого вставляем следующие строки чуть ниже секции dependencies:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
POM-модель spring-boot-starter-parent включает конфигурацию <executions> для привязки цели repackage. Если вы не используете родительскую POM-модель, то вам необходимо объявить эту конфигурацию самостоятельно.

Сохраняем pom.xml и выполняем mvn package из командной строки следующим образом:

$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.7.5:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Если вы посмотрите в target каталог, то должны увидеть там myproject-0.0.1-SNAPSHOT.jar. Размер файла должен составлять около 10 МБ. Если вы хотите заглянуть внутрь, то можете использовать jar tvf, как показано ниже:

$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

В target каталоге также должнен присутствовать гораздо меньший файл с именем myproject-0.0.1-SNAPSHOT.jar.original. Это оригинальный jar-файл, который Maven создал до того, как он был перепакован Spring Boot.

Чтобы запустить это приложение, используйте команду java -jar, как показано ниже:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.7.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 2.536 seconds (JVM running for 2.864)

Как и раньше, чтобы выйти из приложения, нажмите ctrl-c.