Рубрики
Без рубрики

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

Смотрите, как правильно перейти с пружинной загрузки на пружинную.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

2. Пружинные Стартеры Загрузки

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

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

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


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

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

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

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

3. Точка Входа В Приложение

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

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

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

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

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

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

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

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

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

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

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

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

Для явного импорта классов можно использовать @ComponentScan или @Import аннотации в основном классе:

@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.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 , размещенных в одном из этих расположений:

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

Если мы хотим продолжать использовать файлы 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 Data

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

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

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 по умолчанию, а также TransactionManager bean.

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

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

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