«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+:

  1. Servlet container (the server) reads web.xml.
  2. The DispatcherServlet defined in the web.xml is instantiated by the container.
  3. DispatcherServlet creates WebApplicationContext by reading WEB-INF/{servletName}-servlet.xml.
  4. Finally, the DispatcherServlet registers the beans defined in the application context.

7.2. Как Spring Boot загружается?

  1. The container searches for classes implementing ServletContainerInitializer and executes.
  2. The SpringServletContainerInitializer finds all classes implementing WebApplicationInitializer.
  3. The WebApplicationInitializer creates the context with XML or @Configuration classes.
  4. 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, делающее разработку, тестирование и развертывание более удобными.

«