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