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