Последние пару месяцев я активно изучаю Spring Boot и перевожу некоторые из своих проектов на эту архитектуру. В этом посте я в кратце опишу создание простого приложения на Spring Boot.
Стартеры и зависимости
Разработчики Spring Boot постарались по максимуму уменьшить время, уходящее на конфигурирование проекта, добавив в Maven артефакты spring-boot-starter-* из группы org.springframework.boot. По сути это зависимости, которые тянут за собой остальные зависимости, необходимые для разработки приложения нужного типа. Подробнее со списком доступных стартеров можно ознакомиться в официальной документации по Spring Boot.
Хотя, если вы хотите самостоятельно указывать используемые зависимости, можно не использовать стартеры, а указать в зависимостях артефакт spring-boot-autoconfigure из org.springframework.boot. Но в целом стартеры очень удобны.
Приложение
В данном примере я буду использовать единственную зависимость:
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
Она за собой потянет всё необходимое для написания простого веб-приложения.
Так как это standalone-приложение, нам потребуется стадартый класс с методом main:
package name.alexkosarev.sandbox.springboot.rest;
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, args).registerShutdownHook();
}
}
В данном случае аннотация @SpringBootApplication заменяет собой аннотации @Configuration, @EnableAutoConfiguration и @ComponentScan.
В моём примере REST-сервис будет возвращать объект простого класса, в котором будет текстовое сообщение:
Теперь нужно добавить контроллер, который будет обрабатывать запрос и возвращать ответ:
Аннотация @RestController комбинирует в себе @Controller и @ResponseBody, указывая, что данный контроллер является REST-контроллером и возвращаемые значения методов данного класса, помеченных аннотацией @RequestMapping, будут ответами на HTTP-запросы.
В моём примере REST-сервис будет возвращать объект простого класса, в котором будет текстовое сообщение:
package name.alexkosarev.sandbox.springboot.rest.wrappers;
public class MessageWrapper {
private String message;
public MessageWrapper() {
}
public MessageWrapper(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Теперь нужно добавить контроллер, который будет обрабатывать запрос и возвращать ответ:
package name.alexkosarev.sandbox.springboot.rest.services;
import name.alexkosarev.sandbox.springboot.rest.wrappers.MessageWrapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/example")
public class ExampleService {
@RequestMapping
public MessageWrapper index() {
return new MessageWrapper("Hello world!");
}
}
Аннотация @RestController комбинирует в себе @Controller и @ResponseBody, указывая, что данный контроллер является REST-контроллером и возвращаемые значения методов данного класса, помеченных аннотацией @RequestMapping, будут ответами на HTTP-запросы.
Теперь можно запустить приложение и открыть адрес http://localhost:8080/example. В ответ будет выведено {"message":"Hello world!"}.
МегаJAR
Это конечно, круто, скажите вы, но теперь у нас есть JAR с приложением и горстка JAR с зависимостями. Можно ли как-то с этим бороться? Да, можно. Разработчики Spring предлагают 2 варианта решения данной проблемы:
- Поместить все JAR зависимостей в директорию lib внутри JAR проекта, что не очень правильно
- Добавить в Maven-плагин spring-boot-maven-plugin из группы org.springframework.boot с целью repackage, в результате чего в директории target будет лежать 2 JAR: обычный и толстый, в который будут скопировано содержимое всех JAR зависимостей.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.2.5.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Комментариев нет:
Отправить комментарий