«1. Обзор

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

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

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

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

2. Spring Boot Starters

Во-первых, нам понадобится новый набор зависимостей. 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, или ниже аннотация сканирует все классы в том же пакете или ниже. Таким образом, удобная структура пакета может выглядеть следующим образом:

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

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

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

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

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

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

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

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

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

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

5. Миграция ресурсов приложения

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

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

/resources /public /static /META-INF/resources

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

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

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

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

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

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

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

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

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

7.1. Web Starter

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

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

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

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

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

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

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

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

7.2. View Technologies

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

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

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

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

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

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

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

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

8. Миграция приложения Spring Security

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

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

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

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

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

9. Миграция приложения Spring Data

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

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

«

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

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

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

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

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

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

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

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

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

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

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

«