Spring 和 Spring Boot 之间的比较

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,182元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 本文对比了标准Spring框架与Spring Boot的区别,重点分析两者在模块使用(如MVC、Security)上的差异。Spring提供全面的Java开发基础设施支持,包含依赖注入和多种开箱即用的模块;而Spring Boot作为Spring的扩展,通过自动配置、嵌入式服务器等功能简化开发流程。文章还探讨了两者的Maven依赖、Mvc配置、模板引擎配置、启动方式及打包部署等方面的异同,展示了Spring Boot如何通过减少样板代码和配置提升开发效率。总结指出,Spring Boot是Spring的增强版,使应用开发、测试与部署更加便捷高效。

概述

本位我们将讨论标准 Spring 框架和 Spring Boot 之间的区别。

将重点讨论 Spring 的模块,如 MVC 和 Security,在 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 {
   

    @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("/");
    }
}

我们还需要将 @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 只需要几个属性即可在我们添加 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 依赖项和一些配置:


@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的依赖项即可在 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方法:

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

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

  • 容器搜索实现 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);
    }
}

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


@SpringBootApplication
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 本身的扩展,让开发、测试和部署更加方便。

目录
相关文章
|
8天前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
180 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
163 0
|
15天前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
6月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
319 0
|
6月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
247 0
|
6月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
284 0
|
6月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
389 0
|
6月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
184 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
6月前
|
消息中间件 Java API
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
169 0