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

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

Вы можете сократить действия, описанные ниже, перейдя в start.spring.io и выбрав "Web" стартер из поисковика зависимостей. Это создает новую структуру проекта, так что вы можете сразу начать писать код.

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

Нам нужно начать с создания файла Maven pom.xml. 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.2.4.RELEASE</version>
    </parent>

    <description/>
    <developers>
        <developer/>
    </developers>
    <licenses>
        <license/>
    </licenses>
    <scm>
        <url/>
    </scm>
    <url/>

    <!-- Additional lines to be added here... -->
</project>

Предыдущий список должен дать вам рабочую сборку. Вы можете проверить это, запустив mvn package (сейчас вы можете игнорировать предупреждение “jar will be empty - no content was marked for inclusion!” ("jar будет пустым - содержимое не было помечено для включения!")).

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

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

Spring Boot предоставляет несколько “Starters”, которые позволяют вам добавлять файлы jar в ваш путь к классам (classpath). Наше приложение использует spring-boot-starter-parent в родительском разделе POM. Spring-boot-starter-parent - это специальный стартер, который обеспечивает полезные значения по умолчанию Maven. Он также предоставляет раздел dependency-management (управления зависимостями), так что вы можете опустить теги 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/Example.java, содержащий следующий код:

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;

@RestController
@EnableAutoConfiguration
public class Example {

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

    public static void main(String[] args) {
        SpringApplication.run(Example.class, args);
    }

}

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

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

Первой аннотацией в нашем классе Example является @RestController. Это известно как аннотация стереотипа. Он предоставляет подсказки для людей, читающих код, и для Spring, что класс играет особую роль. В этом случае наш класс - это web @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. Нам нужно передать Example.class в качестве аргумента методу run, чтобы сообщить SpringApplication, который класс является основным компонентом Spring. Массив args также передается для предоставления любых аргументов командной строки.

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

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

$ mvn spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.2.4.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)

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

Hello World!

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

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

Мы заканчиваем наш пример созданием полностью автономного исполняемого файла JAR, который мы можем запустить в продуктовой среде. Исполняемые jar (иногда называемые "fat jars") - это архивы, содержащие ваши скомпилированные классы вместе со всеми зависимостями 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 включает конфигурацию <executetions> для привязки repackage задачи. Если вы не используете parent POM, вам необходимо объявить эту конфигурацию самостоятельно. Подробности смотрите в документации к плагину.

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

$ 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.2.4.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

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

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

Вы также должны увидеть гораздо меньший файл с именем 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.2.4.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

Как и прежде, для выхода из приложения нажмите ctrl-c.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки