«1. Обзор
В этом руководстве мы рассмотрим различия между стандартными платформами Spring и Spring Boot.
Мы сосредоточимся и обсудим, чем модули Spring, такие как MVC и Security, отличаются при использовании в ядре Spring по сравнению с использованием с Boot.
2. Что такое весна?
Проще говоря, среда Spring обеспечивает всестороннюю поддержку инфраструктуры для разработки приложений Java.
Он содержит некоторые полезные функции, такие как внедрение зависимостей, и готовые модули, такие как:
-
Spring JDBC Spring MVC Spring Security Spring AOP Spring ORM Spring Test
Эти модули могут значительно сократить время разработки приложения .
Например, на заре веб-разработки на 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. Некоторые из наиболее часто используемых: ~~ Полный список для начинающих см. также в документации Spring.
-
5. Конфигурация MVC
Давайте рассмотрим конфигурацию, необходимую для создания веб-приложения JSP с использованием как Spring, так и Spring Boot.
Spring требует определения сервлета-диспетчера, отображений и других вспомогательных конфигураций. Мы можем сделать это с помощью файла web.xml или класса Initializer:
Нам также нужно добавить аннотацию @EnableWebMvc к классу @Configuration и определить преобразователь представления для разрешения представлений, возвращенных из контроллеры:
Для сравнения, Spring Boot требуется всего несколько свойств, чтобы все заработало, как только мы добавим веб-стартер:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.baeldung");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Вся приведенная выше конфигурация Spring автоматически включается путем добавления веб-загрузки. starter через процесс, называемый автоматической настройкой.
@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 просматривает зависимости, свойства и bean-компоненты, существующие в приложении, и включает настройку на их основе.
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
Конечно, если мы захотим добавить свою собственную конфигурацию, то автонастройка Spring Boot отступит.
5.1. Настройка механизма шаблонов
Теперь давайте узнаем, как настроить механизм шаблонов Thymeleaf как в Spring, так и в Spring Boot.
В Spring нам нужно добавить зависимость thymeleaf-spring5 и некоторые конфигурации для преобразователя представлений:
«
«Spring Boot 1 требует только зависимости spring-boot-starter-thymeleaf, чтобы включить поддержку Thymeleaf в веб-приложении. Из-за новых функций в Thymeleaf3.0 нам также необходимо добавить тимелеаф-макет-диалект в качестве зависимости в веб-приложение Spring Boot 2. В качестве альтернативы мы можем добавить зависимость spring-boot-starter-thymeleaf, которая позаботится обо всем этом за нас.
@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);
}
}
Как только зависимости установлены, мы можем добавить шаблоны в папку src/main/resources/templates, и Spring Boot отобразит их автоматически.
6. Конфигурация безопасности Spring
Для простоты мы увидим, как стандартная HTTP-аутентификация по умолчанию включается с использованием этих фреймворков.
Давайте начнем с рассмотрения зависимостей и конфигурации, необходимых для включения безопасности с помощью Spring.
Spring требует как стандартных зависимостей spring-security-web, так и spring-security-config для настройки безопасности в приложении.
Далее нам нужно добавить класс, который расширяет WebSecurityConfigurerAdapter и использует аннотацию @EnableWebSecurity:
Здесь мы используем inMemoryAuthentication для настройки аутентификации.
@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();
}
}
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 по шагам:
Вот как Spring загружается с использованием подхода Servlet 3+:
- Servlet container (the server) reads web.xml.
- The DispatcherServlet defined in the web.xml is instantiated by the container.
- DispatcherServlet creates WebApplicationContext by reading WEB-INF/{servletName}-servlet.xml.
- Finally, the DispatcherServlet registers the beans defined in the application context.
7.2. Как Spring Boot загружается?
- The container searches for classes implementing ServletContainerInitializer and executes.
- The SpringServletContainerInitializer finds all classes implementing WebApplicationInitializer.
- The WebApplicationInitializer creates the context with XML or @Configuration classes.
- The WebApplicationInitializer creates the DispatcherServlet with the previously created context.
Точка входа приложения Spring Boot — это класс, аннотированный @SpringBootApplication:
По умолчанию Spring Boot использует встроенный контейнер для запуска приложения. В этом случае Spring Boot использует основную точку входа public static void для запуска встроенного веб-сервера.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Он также заботится о привязке bean-компонентов Servlet, Filter и ServletContextInitializer из контекста приложения к встроенному контейнеру сервлетов.
Еще одна особенность Spring Boot заключается в том, что он автоматически сканирует все классы в одном пакете или подпакетах основного класса на наличие компонентов.
Кроме того, Spring Boot предоставляет возможность развертывания в виде веб-архива во внешнем контейнере. В этом случае мы должны расширить SpringBootServletInitializer:
Здесь внешний контейнер сервлетов ищет Main-класс, определенный в файле META-INF веб-архива, а SpringBootServletInitializer позаботится о привязке сервлета , фильтр и ServletContextInitializer.
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
8. Упаковка и развертывание
Наконец, давайте посмотрим, как можно упаковать и развернуть приложение. Обе эти платформы поддерживают общие технологии управления пакетами, такие как Maven и Gradle; однако когда дело доходит до развертывания, эти платформы сильно различаются.
Например, плагин Spring Boot Maven обеспечивает поддержку Spring Boot в Maven. Он также позволяет упаковывать исполняемые файлы jar или war-архивы и запускать приложение «на месте».
Некоторые из преимуществ Spring Boot по сравнению с Spring в контексте развертывания включают в себя:
«Обеспечивает поддержку встроенных контейнеров Возможность независимого запуска jar-файлов с помощью команды java -jar Возможность исключения зависимостей во избежание потенциальных конфликтов jar-файлов при развертывании во внешнем контейнере Возможность указания активных профилей при развертывании Генерация случайных портов для интеграционных тестов
-
9. Заключение
В этой статье мы узнали о различиях между Spring и Spring Boot.
В двух словах можно сказать, что Spring Boot — это просто расширение самого Spring, делающее разработку, тестирование и развертывание более удобными.
«