1. Обзор
В этом уроке мы рассмотрим различия между стандартными платформами Spring и Spring Boot.
Мы сосредоточимся и обсудим, чем модули Spring, такие как MVC и Security, отличаются при использовании в ядре Spring по сравнению с использованием с Boot.
2. Что такое весна?
Проще говоря, среда Spring обеспечивает всестороннюю поддержку инфраструктуры для разработки приложений Java .
Он содержит некоторые приятные функции, такие как внедрение зависимостей, и готовые модули, такие как:
- Весна JDBC
- Весенний МВК
- Весенняя безопасность
- Весенний АОП
- Весенний ОРМ
- Весенний тест
Эти модули могут значительно сократить время разработки приложения.
Например, на заре веб-разработки на Java нам нужно было написать много шаблонного кода, чтобы вставить запись в источник данных. Используя JDBCTemplate
модуля Spring JDBC, мы можем сократить его до нескольких строк кода с помощью всего нескольких конфигураций.
3. Что такое Spring Boot?
Spring Boot — это, по сути, расширение среды Spring, которое устраняет стандартные конфигурации, необходимые для настройки приложения Spring.
В нем используется самоуверенный взгляд на платформу Spring, который прокладывает путь к более быстрой и эффективной экосистеме разработки .
Вот лишь некоторые из особенностей Spring Boot:
- Утвержденные «начальные» зависимости для упрощения сборки и настройки приложения.
- Встроенный сервер для упрощения развертывания приложений
- Метрики, проверка работоспособности и внешняя конфигурация
- Автоматическая конфигурация для функциональности Spring — везде, где это возможно
Давайте познакомимся с обоими этими фреймворками шаг за шагом.
4. Зависимости Maven
Прежде всего, давайте рассмотрим минимальные зависимости, необходимые для создания веб-приложения с использованием Spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</dependency>
В отличие от Spring, Spring Boot требует только одну зависимость для запуска и запуска веб-приложения:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.4</version>
</dependency>
Все остальные зависимости автоматически добавляются в окончательный архив во время сборки.
Еще один хороший пример — тестирование библиотек. Обычно мы используем набор библиотек Spring Test, JUnit, Hamcrest и Mockito. В проекте Spring мы должны добавить все эти библиотеки в качестве зависимостей.
В качестве альтернативы, в Spring Boot нам нужна только начальная зависимость для тестирования, чтобы автоматически включать эти библиотеки.
Spring Boot предоставляет ряд начальных зависимостей для различных модулей Spring. Вот некоторые из наиболее часто используемых:
весна-загрузка-стартер-данные-jpa
весна-загрузка-стартер-безопасность
весенняя загрузка-стартер-тест
весна-загрузка-стартер-сеть
весна-загрузка-стартер-thymeleaf
Для получения полного списка стартеров также ознакомьтесь с документацией Spring .
5. Конфигурация MVC
Давайте рассмотрим конфигурацию, необходимую для создания веб-приложения JSP с использованием как Spring, так и Spring Boot.
Spring требует определения сервлета-диспетчера, отображений и других вспомогательных конфигураций. Мы можем сделать это, используя либо файл web.xml
, либо класс Initializer :
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.foreach");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Нам также нужно добавить аннотацию @EnableWebMvc в класс
@Configuration
и определить преобразователь представления для разрешения представлений, возвращаемых контроллерами:
@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean
= new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
}
Для сравнения, Spring Boot требуется всего несколько свойств, чтобы все заработало после добавления веб-стартера:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
Вся приведенная выше конфигурация Spring автоматически включается путем добавления веб-стартера Boot с помощью процесса, называемого автонастройкой .
Это означает, что Spring Boot рассмотрит зависимости, свойства и bean-компоненты, существующие в приложении, и включит настройку на их основе.
Конечно, если мы захотим добавить собственную пользовательскую конфигурацию, то автоконфигурация Spring Boot отступит.
5.1. Настройка механизма шаблонов
Теперь давайте узнаем, как настроить механизм шаблонов Thymeleaf как в Spring, так и в Spring Boot.
В Spring нам нужно добавить зависимость thymeleaf-spring5
и некоторые конфигурации для преобразователя представлений:
@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver =
new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
}
Spring Boot 1 требует только зависимости spring-boot-starter-thymeleaf
, чтобы включить поддержку Thymeleaf
в веб-приложении. Из-за новых функций в Thymeleaf3.0
нам также необходимо добавить тимелеаф-макет-диалект
в качестве зависимости в веб-приложение Spring Boot 2. В качестве альтернативы мы можем добавить зависимость spring-boot-starter-thymeleaf
, которая позаботится обо всем этом за нас.
Как только зависимости будут установлены, мы можем добавить шаблоны в папку src/main/resources/templates
, и Spring Boot отобразит их автоматически.
6. Конфигурация безопасности Spring
Для простоты мы увидим, как базовая HTTP-аутентификация по умолчанию включается с использованием этих фреймворков.
Давайте начнем с рассмотрения зависимостей и конфигурации, необходимых для включения безопасности с помощью Spring.
Spring требует как стандартных зависимостей spring-security-web,
так и spring-security-config
для настройки безопасности в приложении.
Далее нам нужно добавить класс, который расширяет WebSecurityConfigurerAdapter
и использует аннотацию @EnableWebSecurity
:
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1")
.password(passwordEncoder()
.encode("user1Pass"))
.authorities("ROLE_USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Здесь мы используем inMemoryAuthentication
для настройки аутентификации.
Spring Boot также требует этих зависимостей, чтобы заставить его работать, но нам нужно только определить зависимость spring-boot-starter-security
, так как это автоматически добавит все соответствующие зависимости в путь к классам. ``
Конфигурация безопасности в Spring Boot такая же, как и выше.
Чтобы увидеть, как можно настроить JPA как в Spring, так и в Spring Boot, мы можем ознакомиться с нашей статьей A Guide to JPA with Spring .
7. Начальная загрузка приложения
Основное различие в начальной загрузке приложения в Spring и Spring Boot заключается в сервлете. Spring использует либо web.xml
, либо SpringServletContainerInitializer
в качестве точки входа начальной загрузки.
С другой стороны, Spring Boot использует только функции Servlet 3 для начальной загрузки приложения. Давайте поговорим об этом подробно.
7.1. Как Spring Bootstraps?
Spring поддерживает как устаревший способ загрузки web.xml
, так и последний метод Servlet 3+.
Давайте рассмотрим подход web.xml
по шагам:
- Контейнер сервлетов (сервер) читает
web.xml.
- DispatcherServlet , определенный в
файле web.xml ,
создается
контейнером. `` DispatcherServlet
создаетWebApplicationContext
, читаяWEB-INF/{servletName}-servlet.xml.
- Наконец,
DispatcherServlet
регистрирует bean-компоненты, определенные в контексте приложения.
Вот как Spring загружается с использованием подхода Servlet 3+:
- Контейнер ищет классы, реализующие
ServletContainerInitializer
, и выполняет их. SpringServletContainerInitializer
находит все классы, реализующие WebApplicationInitializer.
- WebApplicationInitializer создает контекст с помощью классов XML
или
@Configuration
. - WebApplicationInitializer
создает
DispatcherServlet
с ранее созданным контекстом.
7.2. Как Spring Boot загружается?
Точка входа приложения Spring Boot — это класс, аннотированный @SpringBootApplication
:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
По умолчанию Spring Boot использует встроенный контейнер для запуска приложения. В этом случае Spring Boot использует основную
точку входа public static void для запуска встроенного веб-сервера.
Он также заботится о привязке bean-компонентов Servlet, Filter
и ServletContextInitializer
из контекста приложения к встроенному контейнеру сервлетов.
Еще одна особенность Spring Boot заключается в том, что он автоматически сканирует все классы в одном пакете или подпакетах основного класса на наличие компонентов.
Кроме того, Spring Boot предоставляет возможность развертывания в виде веб-архива во внешнем контейнере. В этом случае нам нужно расширить SpringBootServletInitializer
:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
Здесь внешний контейнер сервлета ищет класс Main, определенный в файле META-INF веб-архива, а SpringBootServletInitializer
позаботится о привязке Servlet, Filter
и ServletContextInitializer.
8. Упаковка и развертывание
Наконец, давайте посмотрим, как можно упаковать и развернуть приложение. Обе эти платформы поддерживают общие технологии управления пакетами, такие как Maven и Gradle; однако когда дело доходит до развертывания, эти платформы сильно различаются.
Например, плагин Spring Boot Maven обеспечивает поддержку Spring Boot в Maven. Он также позволяет упаковывать исполняемые файлы jar или war-архивы и запускать приложение «на месте».
Некоторые из преимуществ Spring Boot по сравнению со Spring в контексте развертывания включают в себя:
- Обеспечивает встроенную поддержку контейнеров
- Возможность независимого запуска банок с помощью команды
java -jar
- Возможность исключить зависимости, чтобы избежать потенциальных конфликтов jar при развертывании во внешнем контейнере.
- Возможность указать активные профили при развертывании
- Генерация случайных портов для интеграционных тестов
9. Заключение
В этой статье мы узнали о различиях между Spring и Spring Boot.
В двух словах можно сказать, что Spring Boot — это просто расширение самого Spring, делающее разработку, тестирование и развертывание более удобными.