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