Интервьюер Али: Мальчик, скажи мне разницу между Spring и Spring Boot

Java

предисловие

Я слышал много ответов о разнице между Spring и SpringBoot.Я был сбит с толку, когда впервые начал изучать SpringBoot.По мере накопления опыта я постепенно понял разницу между двумя фреймворками.Я считаю Для студентов, которые использовали SpringBoot для долгое время, они до сих пор не совсем понимают разницу между SpringBoot и Spring.После прочтения сравнения в статье, возможно, у вас разные ответы и мнения!

Что такое весна

Как разработчик Java, каждый знаком со Spring.Короче говоря, среда Spring обеспечивает всестороннюю поддержку инфраструктуры для разработки приложений Java. Он включает в себя некоторые приятные функции, такие как внедрение зависимостей и готовые модули, такие как: SpringJDBC, SpringMVC, SpringSecurity, SpringAOP, SpringORM, SpringTest, эти модули сокращают время разработки приложений и повышают эффективность разработки приложений.Например, на ранней стадии разработки JavaWeb нам нужно написать много кода для вставки записей в база данных. Но с помощью JDBCTemplate модуля SpringJDBC мы можем упростить операцию до нескольких строк кода.

Что такое Spring Boot

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

Некоторые возможности SpringBoot:

1. Создайте отдельное приложение Spring. 2. Встроенные контейнеры Tomcat, Jetty, Undertow (нет необходимости развертывать файлы войны). 3. Обеспечить стартеры для упрощения настройки сборки 4. Автоматически настраивайте весенние приложения, насколько это возможно. 5. Обеспечьте производственные показатели, такие как показатели, проверки работоспособности и внешняя конфигурация. 6. Отсутствие требований к генерации кода и настройке XML

Анализ конфигурации

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

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId> spring-boot-starter-web</artifactId>
    <version>2.0.6.RELEASE</version>
</dependency>

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

Еще один хороший пример — тестирование библиотек. Обычно мы используем библиотеки SpringTest, JUnit, Hamcrest и Mockito. В проекте Spring мы должны добавить все эти библиотеки в качестве зависимостей. Но в SpringBoot нам просто нужно добавить зависимость spring-boot-starter-test для автоматического включения этих библиотек.

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

spring-boot-starter-data-jpa spring-boot-starter-security spring-boot-starter-test spring-boot-starter-web spring-boot-starter-thymeleaf

Полный список для начинающих см. в документации Spring.

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

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

Spring необходимо определить сервлет планировщика, сопоставление и другую вспомогательную конфигурацию. Мы можем сделать это с помощью файла web.xml или класса Initializer:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.pingfangushi");
        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;
    }
}

Давайте посмотрим на SpringBoot, После того, как мы добавим веб-стартер, SpringBoot нужно всего лишь настроить несколько свойств в файле конфигурации приложения для выполнения вышеуказанных операций:

spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp Вся приведенная выше конфигурация Spring автоматически включается путем добавления пускового устройства Bootweb с помощью процесса, называемого автоматической настройкой.

Это означает, что SpringBoot просматривает зависимости, свойства и bean-компоненты, существующие в приложении, и на основе этих зависимостей настраивает свойства и bean-компоненты. Конечно, если мы захотим добавить собственную пользовательскую конфигурацию, то автоконфигурация SpringBoot отступит.

Настройка механизма шаблонов

Теперь давайте посмотрим, как настроить механизм шаблонов 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);
    }
}

SpringBoot1X нужна только зависимость spring-boot-starter-thymeleaf, чтобы включить поддержку Thymeleaf в веб-приложениях.   Но из-за новых функций в Thymeleaf 3.0 мы должны добавить диалект тимелеафа-макета в качестве зависимости в приложение SpringBoot2XWeb. С настроенными зависимостями мы можем добавить шаблоны в папку src/main/resources/templates, и SpringBoot автоматически отобразит их.

Конфигурация безопасности Spring

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

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends
        WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("admin")
                .password(passwordEncoder().encode("password"))
                .authorities("ROLE_ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Здесь мы используем inMemoryAuthentication для настройки аутентификации. Опять же, SpringBoot нуждается в этих зависимостях, чтобы заставить его работать. Но нам нужно только определить зависимости для spring-boot-starter-security, так как это автоматически добавит все соответствующие зависимости в путь к классам.

Конфигурация безопасности в SpringBoot такая же, как и выше.

Конфигурация начальной загрузки приложения

Фундаментальное различие между начальной загрузкой приложения в Spring и SpringBoot заключается в сервлете. Spring использует web.xml или SpringServletContainerInitializer в качестве точки входа начальной загрузки. SpringBoot использует только функциональность Servlet3 для начальной загрузки приложения, давайте рассмотрим подробнее

Конфигурация весенней загрузки Spring поддерживает традиционную загрузку web.xml, а также новейший подход Servlet3+.

Действия по настройке запуска метода web.xml

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

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

DispatcherServlet создает WebApplicationContext, читая WEB-INF/{servletName}-servlet.xml. Наконец, DispatcherServlet регистрирует bean-компонент, определенный в контексте приложения.

Шаги весенней загрузки с использованием подхода Servlet3+

Контейнер ищет классы, реализующие ServletContainerInitializer, и выполняет SpringServletContainerInitializer, чтобы найти все классы, реализующие WebApplicationInitializer.WebApplicationInitializer创建具有XML或上下文 @Configuration类 WebApplicationInitializer创建 DispatcherServletс ранее созданным контекстом.

Конфигурация загрузки SpringBoot

Точка входа в приложение Spring Boot — это класс с аннотацией @SpringBootApplication.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

По умолчанию SpringBoot использует встроенный контейнер для запуска приложений. В этом случае SpringBoot использует точку входа publicstaticvoidmain для запуска встроенного веб-сервера. Кроме того, он отвечает за привязку bean-компонентов Servlet, Filter и ServletContextInitializer из контекста приложения к встроенному контейнеру сервлетов. Еще одна особенность SpringBoot заключается в том, что он автоматически сканирует все классы в одном пакете или компоненты в подпакетах класса Main.

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

/**
 * War部署
 */
public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Override
    public void onStartup(ServletContext servletContext)
            throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new HttpSessionEventPublisher());
    }
}

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

Упаковать и развернуть

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

Некоторые из преимуществ SpringBoot по сравнению со Spring в среде развертывания включают в себя:

1. Обеспечьте встроенную поддержку контейнеров 2. Используйте команду _java -jar_ для независимого запуска jar 3. При развертывании во внешнем контейнере вы можете исключить зависимости, чтобы избежать потенциальных конфликтов jar. 4. Возможность гибкого указания файлов конфигурации во время развертывания. 5. Генерация случайных портов для интеграционного тестирования

в заключении

В двух словах, мы можем сказать, что SpringBoot — это просто расширение самого Spring, и это все, что касается этой статьи.После прочтения я надеюсь, что вы все что-то выиграете!