Сравнение между Spring и Spring Boot

Сравнение между Spring и Spring Boot

1. обзор

В этой статье мы рассмотрим различия между стандартными фреймворками Spring и Spring Boot.

Мы сосредоточимся и обсудим, чем модули Spring, такие как MVC и Security, отличаются при использовании в ядре Spring по сравнению с использованием с Boot.

Дальнейшее чтение:

Настройте веб-приложение Spring Boot

Некоторые из наиболее полезных конфигов для приложения Spring Boot.

Read more

Миграция из весны в весеннюю загрузку

Посмотрите, как правильно перейти с Spring на Spring Boot.

Read more

2. Что такое весна?

Simply put, the Spring framework provides comprehensive infrastructure support for developing Java applications.

В нем есть несколько приятных функций, таких как внедрение зависимостей, и готовые модули, например:

  • Spring JDBC

  • Spring MVC

  • Spring Security

  • Весенний АОП

  • Spring ORM

  • Весенний тест

Эти модули могут значительно сократить время разработки приложения.

Например, на заре веб-разработки на Java нам нужно было написать много шаблонного кода для вставки записи в источник данных. Но с помощьюJDBCTemplate модуля Spring JDBC мы можем сократить его до нескольких строк кода с помощью всего нескольких конфигураций.

3. Что такое Spring Boot?

Spring Boot - это, по сути, расширение среды Spring, в которой устранены конфигурации шаблонов, необходимые для настройки приложения Spring.

It takes an opinionated view of the Spring platform which paved the way for a faster and more efficient development eco-system.

Вот лишь некоторые из возможностей Spring Boot:

  • Мнения «начального» для упрощения сборки и конфигурации приложения

  • Встроенный сервер, чтобы избежать сложности при развертывании приложений

  • Метрики, проверка работоспособности и внешняя конфигурация

  • Автоматическая настройка для функциональности Spring - когда это возможно

Давайте шаг за шагом познакомимся с обеими этими фреймворками.

4. Maven Зависимости

Прежде всего, давайте посмотрим на минимальные зависимости, необходимые для создания веб-приложения с использованием Spring:


    org.springframework
    spring-web
    5.1.0.RELEASE


    org.springframework
    spring-webmvc
    5.1.0.RELEASE

В отличие от Spring, Spring Boot требуется только одна зависимость для запуска и запуска веб-приложения:


    org.springframework.boot
    spring-boot-starter-web
    2.0.5.RELEASE

Все остальные зависимости автоматически добавляются в окончательный архив во время сборки.

Еще один хороший пример - тестирование библиотек. Обычно мы используем набор библиотек Spring Test, JUnit, Hamcrest и Mockito. В проекте Spring мы должны добавить все эти библиотеки как зависимости.

Но в Spring Boot нам нужна только начальная зависимость для тестирования, чтобы автоматически включать эти библиотеки.

Spring Boot provides a number of starter dependencies for different Spring modules. Некоторые из наиболее часто используемых:

  • весна-загрузка-стартер-данные JPA

  • пружинная загрузка-стартер-безопасность

  • весенний пусковой тест

  • весна-загрузка-стартер-веб

  • весна-загрузка-стартер-thymeleaf

Чтобы увидеть полный список начинающих, посмотрите такжеSpring documentation.

5. Конфигурация MVC

Давайте рассмотрим конфигурацию, необходимую для создания веб-приложения JSP с использованием Spring и Spring Boot.

Spring requires defining the dispatcher servlet, mappings, and other supporting configurations. Мы можем сделать это с помощью файлаweb.xml или классаInitializer:

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example");

        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 only needs a couple of properties to make things work, once we’ve added the web starter:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Вся указанная выше конфигурация Spring автоматически включается путем добавления веб-стартера Boot через процесс, называемыйauto-configuration.

Это означает, что Spring Boot будет анализировать зависимости, свойства и компоненты, существующие в приложении, и разрешать настройку на их основе.

Конечно, если мы хотим добавить нашу собственную пользовательскую конфигурацию, то автоконфигурация Spring Boot вернется.

5.1. Настройка Template Engine

Давайте теперь узнаем, как настроить механизм шаблонов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 to включить поддержкуThymeleaf в веб-приложении. Но из-за новых функций вThymeleaf3.0, we необходимо добавитьthymeleaf-layout-dialect also в качестве зависимости в веб-приложении Spring Boot 2.

Как только зависимости будут установлены, мы можем добавить шаблоны в папкуsrc/main/resources/templates, и Spring Boot отобразит их автоматически.

6. Конфигурация Spring Security

Для простоты мы увидим, как с помощью этих фреймворков включается стандартная аутентификация HTTP Basic.

Начнем с рассмотрения зависимостей и конфигурации, необходимых для включения безопасности с помощью Spring.

Spring requires both the standard the spring-security-web and spring-security-config dependencies для настройки безопасности в приложении.

Далее аннотацияwe need to add a class that extends the WebSecurityConfigurerAdapter and makes use of the @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 as this will automatically add all the relevant dependencies to the classpath.

Конфигурация безопасности в 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 по шагам:

  1. Контейнер сервлетов (сервер) читаетweb.xml

  2. DispatcherServlet, определенный вweb.xml, создается контейнером

  3. DispatcherServlet создаетWebApplicationContext, читаяWEB-INF/{servletName}-servlet.xml

  4. Наконец,DispatcherServlet регистрирует bean-компоненты, определенные в контексте приложения.

Вот как Spring загружается с использованием подхода Servlet 3+:

  1. Контейнер ищет классы, реализующиеServletContainerInitializer , и выполняет

  2. SpringServletContainerInitializer находит все классы, реализующиеWebApplicationInitializer

  3. WebApplicationInitializer создает контекст с классами XML или@Configuration

  4. WebApplicationInitializer создаетDispatcherServlet w с ранее созданным контекстом.

7.2. Как Spring Boot Bootstraps?

Точкой входа в приложение 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 main для запуска встроенного веб-сервера.

Кроме того, он заботится о привязке bean-компонентовServlet, Filter, иServletContextInitializer из контекста приложения к встроенному контейнеру сервлета.

Еще одна особенность Spring Boot состоит в том, что он автоматически сканирует все классы в одном и том же пакете или подпакетах Main-class для компонентов.

Spring Boot также предоставляет возможность развертывания его как веб-архива во внешнем контейнере. В этом случае мы должны расширитьSpringBootServletInitializer:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    // ...
}

Здесь внешний контейнер сервлетов ищет главный класс, определенный в файле META-INF веб-архива, аSpringBootServletInitializer позаботится о привязкеServlet, Filter, иServletContextInitializer.

8. Упаковка и развертывание

Наконец, давайте посмотрим, как можно упаковать и развернуть приложение. Обе эти платформы поддерживают общие технологии управления пакетами, такие как Maven и Gradle. Но когда дело доходит до развертывания, эти платформы сильно различаются.

Например,Spring Boot Maven Plugin обеспечивает поддержку Spring Boot в Maven. Он также позволяет упаковывать исполняемые архивы jar или war и запускать приложение «на месте».

Вот некоторые из преимуществ Spring Boot по сравнению с Spring в контексте развертывания:

  • Обеспечивает поддержку встроенного контейнера

  • Возможность независимого запуска jar-файлов с помощью командыjava -jar

  • Возможность исключить зависимости, чтобы избежать потенциальных конфликтов JAR при развертывании во внешнем контейнере

  • Возможность указать активные профили при развертывании

  • Генерация случайных портов для интеграционных тестов

9. Заключение

В этом руководстве мы узнали о различиях между Spring и Spring Boot.

В двух словах можно сказать, что Spring Boot - это просто расширение самой Spring, чтобы сделать разработку, тестирование и развертывание более удобными.