Spring Boot — платформа, нацеленная на упрощение разработки приложений с использованием Spring технологий. Spring boot использует принцип соглашения по конфигурации и, предполагая во многих случаях значения по умолчанию, самостоятельно настраивает используемые фреймворки Spring. Кроме того, Spring boot автоматически, при старте приложения, определяет используемые фреймворки, библиотеки и технологии и настраивает их. Впрочем, меньше слов, больше кода.
Создание приложения
Spring boot можно использовать и с maven и с gradle, но так как про gradle я ещё не писал, будем использовать maven. Создать новое приложение можно обычным для maven путём — либо из архетипа, либо вручную написав pom.xml. Однако, у Spring boot есть способ ещё лучше и проще: генератор проектов на https://start.spring.io/
Достаточно вписать параметры приложения, выбрать требуемые библиотеки и скачать готовое пустое приложение.
Простое Spring Boot приложение
Что же входит в минимальное Spring Boot приложение? В первую очередь — pom.xml, который включает в себя зависимости от Spring Boot, плагин Spring Boot и, что самое главное, объявляет проект дочерним модулем Spring Boot.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.easyjava.spring.boot</groupId>
<artifactId>hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hello</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
|
Spring Boot использует концепцию стартеров. Каждый стартер — библиотека Spring Boot, которая добавляет к приложению тот или иной функционал. Стартер обычно имеет в зависимостях все необходимые библиотеки, так что из не требуется добавлять явно, плюс стартер автоматически настраивает эти библиотеки. Например spring-boot-starter-web добавляет поддержку Spring MVC и REST, автоматически настраивает их и автоматически включает веб сервер.
Кроме того, в приложении SpringBoot всегда есть класс приложения и он, обычно, всегда выглядит примерно одинаково:
1
2
3
4
5
6
7
|
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
|
Как можно видеть, это стандартный java entry point, с которого начинается исполнение java программы. Сам класс аннотирован @SpringBootApplication, что и делает его классом приложения и фактически включает Spring boot. Единственная строка кода в классе запускает Spring Boot. Как видно, это гораздо проще классической конфигурации Spring.
Наконец, класс теста, который уже настроен на загрузку контекста Spring с использованием Spring Boot:
1
2
3
4
5
6
7
8
9
|
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloApplicationTests {
@Test
public void contextLoads() {
}
}
|
Поддержку модульного тестирования добавляет стартер spring-boot-starter-test.
Использование Spring Boot
Пустое приложение сразу готово к сборке и запуску, но радости оно не несёт. Давайте попробуем добавить классический «Hello, World!». Для этого создадим два класса, которые будут определять кто здоровается и генерировать строку. Такая сложная конструкция, конечно, не требуется для столь простой задачи, но покажет как все работает.
1
2
3
4
|
@Component
public class Target {
public String get() { return "Boot"; }
}
|
1
2
3
4
5
6
7
8
|
@Component
public class Greeter {
@Autowired
private Target target;
public String get() {
return String.format("Hello, %s!", target.get());
}
}
|
В классах используются стандартные возможности Spring по внедрению зависимостей. Вновь написанный код конечно же надо протестировать:
1
2
3
4
5
6
7
8
9
10
11
12
|
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloApplicationTests {
@Autowired
private Greeter greeter;
@Test
public void contextLoads() {
assertThat(greeter.get(), is("Hello, Boot!"));
}
}
|
Обратите внимание, что, несмотря на то, что зависимости от junit и hamcrest не были явно объявлены, они всё равно доступны, так как их добавляет spring-boot-starter-test.
Наконец используем эти классы по назначению:
1
2
3
4
5
6
7
8
9
|
@Component
public class Greet implements ApplicationRunner{
@Autowired
private Greeter greeter;
@Override public void run(ApplicationArguments applicationArguments) throws Exception {
System.out.println(greeter.get());
}
}
|
Метод run() классов, реализующих интерфейс ApplicationRunner, будет автоматически вызван после создания контекста. Это не самый лучший метод использования Spring Boot, но для примера сойдёт, а методы получше мы рассмотрим в следующий раз.
Запустим приложение, чтобы убедиться, что всё работает:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
❯❯❯ java -jar target/hello-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.0.M5)
2017-10-24 18:23:07.599 INFO 12246 --- [ main] r.e.spring.boot.hello.HelloApplication : Starting HelloApplication v0.0.1-SNAPSHOT on dhcp131-93.brq.redhat.com with PID 12246 (/home/dchaplyg/Dropbox/Work/EasyJava/Blog/Spring/Boot/Hello/target/hello-0.0.1-SNAPSHOT.jar started by dchaplyg in /home/dchaplyg/Dropbox/Work/EasyJava/Blog/Spring/Boot/Hello)
2017-10-24 18:23:07.602 INFO 12246 --- [ main] r.e.spring.boot.hello.HelloApplication : No active profile set, falling back to default profiles: default
2017-10-24 18:23:07.647 INFO 12246 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1c2c22f3: startup date [Tue Oct 24 18:23:07 CEST 2017]; root of context hierarchy
2017-10-24 18:23:08.078 INFO 12246 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
Hello, Boot!
2017-10-24 18:23:08.095 INFO 12246 --- [ main] r.e.spring.boot.hello.HelloApplication : Started HelloApplication in 0.843 seconds (JVM running for 1.124)
2017-10-24 18:23:08.095 INFO 12246 --- [ Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@1c2c22f3: startup date [Tue Oct 24 18:23:07 CEST 2017]; root of context hierarchy
2017-10-24 18:23:08.096 INFO 12246 --- [ Thread-2] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
|
Код примера доступен на github