问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring 和 Spring Boot 之间的比较

创作时间:
作者:
@小白创作中心

Spring 和 Spring Boot 之间的比较

引用
1
来源
1.
https://www.cnblogs.com/Naylor/p/18795681

Spring和Spring Boot是Java开发中常用的框架,它们在功能和使用方式上有很多不同之处。本文将从Maven依赖、Mvc配置、应用程序启动和打包部署等多个方面,详细比较Spring和Spring Boot的区别,帮助开发者更好地理解这两个框架的特点和适用场景。

什么是 Spring

简而言之,Spring框架为开发Java应用程序提供了全面的基础设施支持。它包含了一些不错的功能,如依赖注入,以及开箱即用的模块,如:

  • jdbc
  • mvc
  • security
  • aop
  • orm
  • ......

这些模块可以大大缩短应用程序的开发时间。

例如,在Java Web开发的早期,我们需要编写大量样板代码才能将记录插入数据源。通过使用Spring JDBC模块的JDBCTemplate,我们可以将其简化为几行代码,只需少量配置即可。

什么是SpringBoot

Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的样板配置。它对Spring平台持固执己见的看法,这为更快、更高效的开发生态系统铺平了道路。以下是Spring Boot中的一些功能:

  • 预置的依赖项,简化构建和应用程序配置
  • 嵌入tomcat服务器
  • 指标、运行监控和外部化配置
  • 自动配置Spring功能
  • ......

Maven依赖

首先,让我们看看使用Spring创建Web应用程序所需的最低依赖项:

<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只需要一个依赖项即可启动并运行Web应用程序:

<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中,我们只需要用于测试的starter依赖项即可自动包含这些库。

Spring Boot为不同的Spring模块提供了许多Starter依赖项。一些最常用的是:

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

Mvc配置

让我们探索一下使用Spring和Spring Boot创建JSP Web应用程序所需的配置。Spring需要定义调度程序servlet、映射和其他支持配置。我们可以使用web.xml文件或Initializer类来做到这一点

public class MyWebAppInitializer implements WebApplicationInitializer {
 
    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("/");
    }
}

我们还需要将@EnableWebMvc注解添加到@Configuration类中,并定义一个视图解析器来解析从控制器返回的视图

public class ClientWebConfig implements WebMvcConfigurer { 
   public ViewResolver viewResolver() {
      InternalResourceViewResolver bean
        = new InternalResourceViewResolver();
      bean.setViewClass(JstlView.class);
      bean.setPrefix("/WEB-INF/view/");
      bean.setSuffix(".jsp");
      return bean;
   }
}

相比之下,Spring Boot只需要几个属性即可在我们添加Web启动器后正常工作:

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

通过称为auto-configuration的过程添加Boot Web启动器,会自动包含上述所有Spring配置。这意味着Spring Boot将查看应用程序中存在的依赖项、属性和bean,并基于这些启用配置。

当然,如果我们想添加自己的自定义配置,那么Spring Boot自动配置将退出。

配置模板引擎

现在让我们学习如何在Spring和Spring Boot中配置Thymeleaf模板引擎。在Spring中,我们需要为视图解析器添加thymeleaf-spring5依赖项和一些配置:

public class MvcWebConfig implements WebMvcConfigurer {

    private ApplicationContext applicationContext;

    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = 
          new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
}

Spring Boot 1只需要spring-boot-starter-thymeleaf的依赖项即可在Web应用程序中启用Thymeleaf支持。由于Thymeleaf3.0中的新功能,我们还必须在Spring Boot 2 Web应用程序中添加thymeleaf-layout-dialect作为依赖项。或者,我们可以选择添加一个spring-boot-starter-thymeleaf依赖项,它将为我们处理所有这些。一旦依赖项就位,我们就可以将模板添加到src/main/resources/templates文件夹中,Spring Boot将自动显示它们。

应用程序启动

Spring如何启动

Spring既支持传统的web.xml引导方式,也支持最新的Servlet 3+方法。

让我们逐步查看web.xml方法:

  1. Servlet容器(服务器)读取web.xml。
  2. web.xml中定义的DispatcherServlet由容器实例化。
  3. DispatcherServlet通过读取WEB-INF/{servletName}-servlet.xml来创建WebApplicationContext。
  4. 最后,DispatcherServlet注册在应用程序上下文中定义的bean。

以下是Spring如何使用Servlet 3+方法进行引导:

  1. 容器搜索实现ServletContainerInitializer的类并执行。
  2. SpringServletContainerInitializer查找实现WebApplicationInitializer的所有类。
  3. WebApplicationInitializer使用XML或@Configuration类创建上下文。
  4. WebApplicationInitializer使用之前创建的上下文创建DispatcherServlet。

SpringBoot如何启动

Spring Boot应用程序的入口点是用@SpringBootApplication注释的类:

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

默认情况下,Spring Boot使用嵌入式容器来运行应用程序。在这种情况下,Spring Boot使用public static void main入口点来启动嵌入式Web服务器。它还负责将Servlet、Filter和ServletContextInitializer bean从应用程序上下文绑定到嵌入式servlet容器。Spring Boot的另一个功能是它会自动扫描Main-class的同一包或子包中的所有类以查找组件。此外,Spring Boot还提供了将其作为Web存档部署到外部容器中的选项。在这种情况下,我们必须扩展SpringBootServletInitializer:

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

在这里,外部Servlet容器查找在Web存档的META-INF文件中定义的Main类,而SpringBootServletInitializer将负责绑定Servlet、Filter和ServletContextInitializer。

打包和部署

最后,让我们看看如何打包和部署应用程序。这两个框架都支持Maven和Gradle等常见的包管理技术;但是,在部署方面,这些框架差异很大。例如,Spring Boot Maven插件在Maven中提供Spring Boot支持。它还允许打包可执行的jar或war存档,并“就地”运行应用程序。在部署上下文中,Spring Boot相对于Spring的一些优势包括:

  • 提供嵌入式容器支持使用
  • 命令java -jar配置独立运行jar
  • 选择排除依赖项以避免在外部容器中部署时发生潜在jar冲突
  • 部署时指定活动配置文件的选项
  • 用于集成测试的随机端口生成

结论

在本文中,我们了解了Spring和Spring Boot之间的区别。简单来说,我们可以说Spring Boot只是Spring本身的扩展,让开发、测试和部署更加方便。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号