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