Миграция с весны на весеннюю загрузку

Миграция из весны в весеннюю загрузку

1. обзор

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

Spring Boot is not intended to replace Spring, but to make working with it faster and easier. В результате большая часть изменений, необходимых для миграции приложения, связана с конфигурацией. По большей части наши пользовательские контроллеры и другие компоненты останутся прежними.

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

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

  • автоконфигурация по умолчанию

  • встроенный веб-сервер

  • метрики приложений и проверки работоспособности

  • расширенная внешняя конфигурация

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

Во-первых, нам понадобится новый набор зависимостей. Spring Boot provides convenient starter dependencies, which are dependency descriptors, который может предоставить все необходимые технологии для определенных функций.

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

Самый быстрый способ начать - добавитьspring-boot-starter-parentpom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    1.5.6.RELEASE

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

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

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

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

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

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

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

  • @Configuration - который отмечает класс как источник определений bean-компонентов

  • @EnableAutoConfiguration - указывает фреймворку на автоматическое добавление bean-компонентов на основе зависимостей пути к классам.

  • @ComponentScan - который сканирует другие конфигурации и bean-компоненты в том же пакете, что и классApplication или ниже

By default, the @SpringBootApplication annotation scans all classes in the same package or below. Следовательно, удобная структура пакета может выглядеть так:

image

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

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

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

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

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

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

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

  • импортировать классы явно

To import the classes explicitly, you can use the @ComponentScan or @Import annotations в основном классе:

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

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

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

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

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

  • /Ресурсы

  • / общественности

  • / статический

  • /META-INF/resources

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

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

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

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

  • подкаталог/config текущего каталога

  • текущий каталог

  • каталог/config в пути к классам

  • корень пути к классам

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

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

Также доступно большое количествоpredefined property names для настройки различного поведения приложения.

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

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

7.1. Web Starter

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


    org.springframework.boot
    spring-boot-starter-web

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

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

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

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

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

  • поддержка обслуживания статического содержимого из каталога с именем/static,/public,/resources или/META-INF/resources в пути к классам

  • КомпонентыHttpMessageConverter для распространенных случаев использования, таких как JSON и XML

  • отображение/error, которое обрабатывает все ошибки

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

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


    org.springframework.boot
    spring-boot-starter-thymeleaf

Файлы шаблонов следует поместить в папку/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:


    org.springframework.boot
    spring-boot-starter-tomcat

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

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

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


    org.springframework.boot
    spring-boot-starter-security

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

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

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

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

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


    org.springframework.boot
    spring-boot-starter-data-jpa

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

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


    com.h2database
    h2

Если мы хотим работать с другим типом и конфигурацией базы данных, например, с базой данных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.

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