百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

SpringBoot 有哪些优点,它和 Spring 有什么区别

lipiwang 2024-10-23 13:56 15 浏览 0 评论

Spring 和 Spring Boot 有什么区别

Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。

Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支持

Spring Boot 的优点有哪些

1、更快速的构建能力

Spring Boot 提供了更多的 Starters 用于快速构建业务框架,Starters 可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找依赖包。

当我们添加了 Starter 模块支持之后,在项目的构建期,它就会把所有其他依赖项将自动添加到项目中。

2、起步依赖

Spring Boot 提供了起步依赖,也就是在创建 Spring Boot 时可以直接勾选依赖模块,这样在项目初始化时就会把相关依赖直接添加到项目中,大大缩短了查询并添加依赖的时间,如下图所示

3、内嵌容器支持

Spring Boot 内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat,这个在我们启动 Spring Boot 项目的时候,在控制台上就能看到.

我们可以通过修改 pom.xml 来移除内嵌的 Tomcat 更换为其他的容器,比如更换为 Jetty 容器,配置如下:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

    <!-- 移处 Tomcat -->

    <exclusions>

        <exclusion>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-tomcat</artifactId>

        </exclusion>

    </exclusions>

</dependency>

<!-- 移处 jetty 容器 -->

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-jetty</artifactId>

</dependency>

4、Actuator 监控

Spring Boot 自带了 Actuator 监控功能,主要用于提供对应用程序监控,以及控制的能力,比如监控应用程序的运行状况,或者内存、线程池、Http 请求统计等,同时还提供了关闭应用程序等功能。

Actuator 提供了 19 个接口,接口请求地址和代表含义如下表所示:

Spring Boot 启动源码分析

Spring Boot 程序的入口是 SpringApplication.run(Application.class, args) 方法,它的源码如下:

public ConfigurableApplicationContext run(String... args) {

    // 1.创建并启动计时监控类

    StopWatch stopWatch = new StopWatch();

    stopWatch.start();

    // 2.声明应用上下文对象和异常报告集合

    ConfigurableApplicationContext context = null;

    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();

    // 3.设置系统属性 headless 的值

    this.configureHeadlessProperty();

    // 4.创建所有 Spring 运行监听器并发布应用启动事件

    SpringApplicationRunListeners listeners = this.getRunListeners(args);

    listeners.starting();

    Collection exceptionReporters;

    try {

        // 5.处理 args 参数

        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

        // 6.准备环境

        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);

        this.configureIgnoreBeanInfo(environment);

        // 7.创建 Banner 的打印类

        Banner printedBanner = this.printBanner(environment);

        // 8.创建应用上下文

        context = this.createApplicationContext();

        // 9.实例化异常报告器

        exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);

        // 10.准备应用上下文

        this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

        // 11.刷新应用上下文

        this.refreshContext(context);

        // 12.应用上下文刷新之后的事件的处理

        this.afterRefresh(context, applicationArguments);

        // 13.停止计时监控类

        stopWatch.stop();

        // 14.输出日志记录执行主类名、时间信息

        if (this.logStartupInfo) {

            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);

        }

        // 15.发布应用上下文启动完成事件

        listeners.started(context);

        // 16.执行所有 Runner 运行器

        this.callRunners(context, applicationArguments);

    } catch (Throwable var10) {

        this.handleRunFailure(context, var10, exceptionReporters, listeners);

        throw new IllegalStateException(var10);

    }

    try {

        // 17.发布应用上下文就绪事件

        listeners.running(context);

        // 18.返回应用上下文对象

        return context;

    } catch (Throwable var9) {

        this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);

        throw new IllegalStateException(var9);

    }

}

Spring Boot 的启动流程

1、创建并启动计时监控类

此计时器是为了监控并记录 Spring Boot 应用启动的时间的,它会记录当前任务的名称,然后开启计时器。

2、声明应用上下文对象和异常报告集合

此过程声明了应用上下文对象和一个异常报告的 ArrayList 集合。

3、设置系统属性 headless 的值

设置 Java.awt.headless = true,其中 awt(Abstract Window Toolkit)的含义是抽象窗口工具集。设置为 true 表示运行一个 headless 服务器,可以用它来作一些简单的图像处理。

4、创建所有 Spring 运行监听器并发布应用启动事件

此过程用于获取配置的监听器名称并实例化所有的类。

5、初始化默认应用的参数类

也就是说声明并创建一个应用参数对象。

6、准备环境

创建配置并且绑定环境(通过 property sources 和 profiles 等配置文件)。

7、创建 Banner 的打印类

Spring Boot 启动时会打印 Banner 图片,如下图所示:

此 banner 信息是在 SpringBootBanner 类中定义的,我们可以通过实现 Banner 接口来自定义 banner 信息,然后通过代码 setBanner() 方法设置 Spring Boot 项目使用自己自定义 Banner 信息,或者是在 resources 下添加一个 banner.txt,把 banner 信息添加到此文件中,就可以实现自定义 banner 的功能了。

8、创建应用上下文

根据不同的应用类型来创建不同的 ApplicationContext 上下文对象。

9、实例化异常报告器

它调用的是 getSpringFactoriesInstances() 方法来获取配置异常类的名称,并实例化所有的异常处理类。

10、准备应用上下文

此方法的主要作用是把上面已经创建好的对象,传递给 prepareContext 来准备上下文,例如将环境变量 environment 对象绑定到上下文中、配置 bean 生成器以及资源加载器、记录启动日志等操作。

11、刷新应用上下文

此方法用于解析配置文件,加载 bean 对象,并且启动内置的 web 容器等操作。

12、应用上下文刷新之后的事件处理

这个方法的源码是空的,可以做一些自定义的后置处理操作。

13、停止计时监控类

停止此过程第一步中的程序计时器,并统计任务的执行信息。

14、输出日志信息

把相关的记录信息,如类名、时间等信息进行控制台输出。

15、发布应用上下文启动完成事件

触发所有 SpringApplicationRunListener 监听器的 started 事件方法。

16、执行所有 Runner 运行器

执行所有的 ApplicationRunner 和 CommandLineRunner 运行器。

17、发布应用上下文就绪事件

触发所有的 SpringApplicationRunListener 监听器的 running 事件。

18、返回应用上下文对象

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: