Перейти к основному содержимому

Переход с Spring на Spring Boot

· 7 мин. чтения

1. Обзор

В этой статье мы рассмотрим, как мы можем перенести существующее приложение Spring Framework в приложение Spring Boot .

Spring Boot не предназначен для замены Spring, а для того, чтобы сделать работу с ним быстрее и проще. В результате большинство изменений, необходимых для переноса приложения, связаны с конфигурацией. По большей части наши пользовательские контроллеры и другие компоненты останутся прежними.

Разработка с использованием Spring Boot дает несколько преимуществ:

  • более простое управление зависимостями
  • автоконфигурация по умолчанию
  • встроенный веб-сервер
  • метрики приложений и проверки работоспособности
  • расширенная внешняя конфигурация

2. Стартеры Spring Boot

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

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

Самый быстрый способ начать работу — добавить файл pom.xml spring-boot-starter-parent :

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

Это позаботится об управлении зависимостями.

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

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

3. Точка входа приложения

Каждое приложение, созданное с использованием Spring Boot , должно определить основную точку входа. Обычно это класс Java с основным методом, аннотированным @SpringBootApplication :

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

Аннотация @SpringBootApplication добавляет следующие аннотации:

  • @Configuration — помечает класс как источник определений bean-компонентов.
  • @EnableAutoConfiguration — указывает платформе автоматически добавлять bean-компоненты на основе зависимостей пути к классам.
  • @ComponentScan — сканирует другие конфигурации и bean-компоненты в том же пакете, что и класс Application , или ниже.

По умолчанию аннотация @SpringBootApplication сканирует все классы в том же пакете или ниже. Поэтому удобная структура пакета может выглядеть так:

./6a81920bbf9ef0b36d21d2dfef2ec42b.png

Если ваше приложение не является веб-приложением, которое создает ApplicationContext , этот код можно удалить и заменить классом @SpringBootApplication выше.

Проблема, с которой мы можем столкнуться, имеет конфликтующие классы конфигурации. Чтобы избежать этого, у нас есть возможность фильтровать сканируемые классы:

@SpringBootAppliaction
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX,
pattern = "com.foreach.config.*")})
public class Application {
//...
}

4. Импорт конфигурации и компонентов

Spring Boot в значительной степени зависит от аннотаций для конфигурации, но вы по-прежнему можете импортировать существующую конфигурацию как в формате аннотаций, так и в формате XML.

Для того, чтобы ваши существующие @Configuration или классы компонентов были выбраны, у вас есть два варианта:

  • переместите существующие классы в пакет, который является таким же или ниже основного пакета класса приложения
  • импортировать классы явно

Чтобы явно импортировать классы, вы можете использовать аннотации @ComponentScan или @Import для основного класса:

@SpringBootApplication
@ComponentScan(basePackages="com.foreach.config")
@Import(UserRepository.class)
public class Application {
//...
}

Официальная документация рекомендует использовать аннотации вместо конфигурации XML. Однако, если у вас уже есть XML-файлы, которые вы не хотите преобразовывать в конфигурацию Java, вы все равно можете импортировать их с помощью @ImportResource :

@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
//...
}

5. Перенос ресурсов приложения

По умолчанию Spring Boot ищет файлы ресурсов в одном из следующих мест:

  • /Ресурсы
  • /публичный
  • / статический
  • /META-INF/ресурсы

Для миграции мы можем переместить все наши файлы ресурсов в одно из этих мест или настроить расположение ресурсов, установив свойство spring.resources.static-locations :

spring.resources.static-locations=classpath:/images/,classpath:/jsp/

6. Перенос свойств приложения

Фреймворк автоматически загрузит любые свойства, определенные в файлах с именами application.properties или application.yml, размещенных в одном из следующих мест:

  • подкаталог /config текущего каталога
  • текущий каталог
  • каталог /config в пути к классам
  • корень пути к классам

Чтобы не загружать свойства явно, мы можем переместить их в файл с таким именем в одном из этих мест. Например, в папку /resources , которая должна присутствовать в пути к классам.

Мы также можем автоматически загружать специфичные для профиля свойства из файлов с именем application-{profile}.properties .

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

Каждый модуль Spring Framework, который вы используете в своем приложении, потребует небольших модификаций, в основном связанных с конфигурацией. Давайте рассмотрим некоторые из наиболее часто используемых функций.

7. Перенос веб-приложения Spring

7.1. Веб-стартер

Spring Boot предоставляет стартовую площадку для веб-приложений, которая включает все необходимые зависимости. Это означает, что мы можем удалить все веб-зависимости из среды Spring и заменить их на spring-boot-starter-web :

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

Поскольку Spring Boot пытается автоматически настроить приложение, когда это возможно, на основе пути к классам, добавление этой зависимости приведет к добавлению аннотации @EnableWebMvc к основному классу Application , а также к настройке bean-компонента DispatcherServlet .

Если у вас есть класс WebApplicationInitializer , который настраивает DispatcherServlet , в этом больше нет необходимости, как и в аннотации @EnableWebMvc .

Мы можем, конечно, определить наши bean-компоненты, если мы хотим пользовательского поведения, и в этом случае будут использоваться наши bean-компоненты.

Если мы явно используем аннотацию @EnableWebMvc в классе @Configuration , то автоматическая настройка MVC больше не будет включена.

Добавление веб-стартера также определяет автоматическую настройку следующих компонентов:

  • поддержка обслуживания статического контента из каталога с именем /static , /public , /resources или /META-INF/resources в пути к классам
  • Компоненты HttpMessageConverter для распространенных случаев использования, таких как JSON и XML .
  • сопоставление /error , которое обрабатывает все ошибки

7.2. Посмотреть технологии

Что касается создания веб-страниц, официальная документация рекомендует не использовать файлы JSP и вместо этого использовать механизм шаблонов. Автоматическая настройка включена для следующих механизмов шаблонов: Thymeleaf , Groovy , FreeMarker , Mustache . Все, что нам нужно сделать, чтобы использовать один из них, это добавить конкретный стартер:

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

Файлы шаблона должны быть помещены в папку /resources/templates .

Если мы хотим продолжать использовать файлы JSP, нам нужно настроить приложение так, чтобы оно могло разрешать JSP. Например, если наши файлы находятся в /webapp/WEB-INF/views , то нам нужно установить следующие свойства:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

7.3. Встроенный веб-сервер

Кроме того, мы также можем запустить наше приложение с помощью встроенного сервера Tomcat, который будет автоматически настроен на порт 8080 путем добавления зависимости spring-boot-starter-tomcat :

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

Другими веб-серверами, для которых Spring Boot обеспечивает автоматическую настройку, являются Jetty и Undertow .

8. Перенос приложения безопасности Spring

Стартер для включения Spring Security — это spring-boot-starter-security :

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

По умолчанию это создаст пользователя с именем «пользователь» со случайно сгенерированным паролем, зарегистрированным во время запуска, и защитит все конечные точки с помощью базовой аутентификации. Однако обычно мы хотим добавить нашу конфигурацию безопасности, которая отличается от стандартной.

По этой причине мы сохраним наш существующий класс с аннотацией @EnableWebSecurity , которая расширяет WebSecurityConfigurerAdapter и определяет пользовательскую конфигурацию:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
}

9. Перенос приложения данных Spring

В зависимости от того, какую реализацию Spring Data мы используем, нам нужно будет добавить соответствующий стартер. Например, для JPA мы можем добавить зависимость spring-boot-starter-data-jpa :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Если мы хотим использовать базу данных в памяти, добавив соответствующую автоматическую настройку зависимостей для баз данных типа H2 , Derby и HSQLDB .

Например, для работы с базой данных H2 в памяти все, что нам нужно, — это зависимость h2 :

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

Если мы хотим работать с другим типом базы данных и конфигурацией, например с базой данных MySQL , нам нужна зависимость, а также определение конфигурации.

Для этого мы можем либо сохранить наше определение bean-компонента DataSource , либо использовать предопределенные свойства:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass

Spring Boot автоматически настроит Hibernate в качестве поставщика JPA по умолчанию, а также bean-компонента transactionManager .

10. Заключение

В этой статье мы показали некоторые распространенные сценарии, возникающие при переносе существующего приложения Spring на более новую платформу Spring Boot .

В целом, ваш опыт миграции будет, конечно, сильно зависеть от приложения, которое вы создали.