• SpringBoot SpringBoot 基础篇(第一篇) 第1章 SpringBoot 入门 1.4 HelloWorld 执行分析


    SpringBoot

    【千锋教育java教程SpringBoot2全套,springboot快速入门到项目实战视频教程】

    SpringBoot 基础篇(第一篇)

    第1章 SpringBoot 入门

    1.4 HelloWorld 执行分析

    快速入门程序就是这样,可以发现springBoot程序开发比spring程序编写起来容易的多。

    配置简洁,依赖关系简单,启动运行容易。

    从以下几个方面研究:

    1. SpringBoot 的启动依赖
    2. 启动器starter 有什么作用
    3. 启动引导类是怎么运行的
    4. 内置的Tomcat 服务器原理
    1.4.1 pom.xml 文件分析

    这是应用的第一项配置,依赖的作用到底是什么?

    • 项目中,pom.xml 中继承的坐标

      在这里插入图片描述

      点击去查看

      在这里插入图片描述

      可以看见它其实又继承了另一个坐标

    • 这个坐标中定义了两组信息,第一组是各式各样的依赖版本号属性

      在这里插入图片描述

    • 第二组是各式各样的的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值

      在这里插入图片描述

      【注意】上面的依赖坐标定义是出现在<dependencyManagement>标签中的,其实是对引用坐标的依赖管理,并不是实际使用的坐标。

      因此当你的项目中继承了这组parent信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个依赖

      • 因为在maven中继承机会只有一次,上述继承的格式还可以切换成导入的形式进行,并且在阿里云的starter创建工程时就使用了此种形式

        在这里插入图片描述

        SpringBoot做了无数个技术版本搭配的列表,这个技术搭配列表的名字叫做parent。

        parent自身具有很多个版本,每个parent版本中包含有几百个其他技术的版本号,不同的parent间使用的各种技术的版本号有可能会发生变化。

        当开发者使用某些技术时,直接使用SpringBoot提供的parent就行了,由parent帮助开发者统一的进行各种技术的版本管理

        现在这一切工作都可以交给parent来做了。开发者无需关注这些技术间的版本冲突问题,只需要关注用什么技术就行了,冲突问题由parent负责处理。

    【总结】

    • 开发SpringBoot程序要继承spring-boot-starter-parent
    • spring-boot-starter-parent中定义了若干个依赖管理
    • 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
    • 继承parent的形式也可以采用引入依赖的形式实现效果
    1.4.2 starter

    SpringBoot官方给出了好多个starter的定义,方便开发者使用,而且名称都是如下格式:

    命名规则:spring-boot-starter-技术名称
    
    • 1

    starter定义了使用某种技术时对于依赖的固定搭配格式,也是―种最佳解决方案,使用starter可以帮助开发者减少依赖配置

    • 项目中的pom.xml定义了使用SpringMVC技术,但是并没有写SpringMVC的坐标,而是添加了一个名字中包含starter的依赖

      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-webartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4

      在这里插入图片描述

    • 在spring-boot-starter-web中又定义了若干个具体依赖的坐标

      在这里插入图片描述

      以前学习的开发SpringMVC程序需要导入spring-webmvc的坐标和spring整合web开发的坐标,就是上面这组坐标中的最后两个。

      我们发现除了这两个还有其他的,比如第二个,叫做spring-boot-starter-json。看名称就知道,这个是与json有关的坐标了,但是看名字发现和最后两个又不太一样,它的名字中也有starter,打开看看里面有什么?

      在这里插入图片描述

      可以发现,这个starter中又包含了若干个坐标,其实就是使用SpringMVC开发通常都会使用到Json,使用json又离不开这里面定义的这些坐标,看来还真是方便,SpringBoot把我们开发中使用的东西能用到的都给提前做好了。

      你仔细看完会发现,里面有一些你没用过的。的确会出现这种过量导入的可能性,沿关系可以通过maven中的排除依赖剔除掉一部分。不过你不管它也没事,大不了就是过量导入。

    【总结】

    使用starter可以帮开发者快速配置依赖关系。

    以前写依赖3个坐标的,现在写导入一个就搞定了,加速依赖配置

    1.4.3 引导类

    目前程序运行的入口就是SpringBoot工程创建时自带的那个类了,带有main方法的那个类,运行这个类就可以启动SpringBoot工程的运行

    在这里插入图片描述

    SpringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象(loC容器)并将所有的对象交给Spring的容器管理,也就是一个一个的Bean。

    那用了SpringBoot 来加速开发spring程序,这个容器还在吗?

    → 这个疑问不用说,一定在。

    当前这个类运行后就会产生一个spring容器对象,并且可以将这个对象保存起来,通过容器对象直接操作Bean。

    看一下

    @SpringBootApplication
    public class HelloWorldMainApplication {
        public static void main(String[] args) {
            
            ConfigurableApplicationContext ctx = SpringApplication.run(HelloWorldMainApplication.class,args);
    
            HelloController bean = ctx.getBean(HelloController.class);
            System.out.println(bean);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    可以看到,SpringBoot 程序启动还是创建了一个Spring 容器对象。

    这个类在SpringBoot 程序中是所有功能的入口,我们称这个类 为 引导类

    作为一个引导类最典型的特征就是当前类上方声明了一个注解 @SpringBootApplication

    【总结】

    • SpringBoot工程提供引导类用来启动程序
    • SpringBoot工程启动后创建并初始化Spring容器
    1.4.4 内置服务器

    当前我们做的SpringBoot入门案例勾选了Spirng-web的功能,并且导入了对应的starter。

    在这里插入图片描述

    SpringBoot发现,既然开发者要做web程序,肯定离不开使用web服务器,这样吧,帮人帮到底,送佛送到西。它帮我们搞一个web服务器,你要愿意用,直接使用就好了,干脆我再多给你几种选择,你随便切换。万一你不想用我给你提供的,也行,你可以自己搞。

    由于这个功能不属于程序的主体功能,可用可不用,于是乎SpringBoot将其定位成辅助功能

    别小看这么一个辅助功能,它帮开发者又减少了好多的设置性工作。

    【内嵌Tomcat 定义位置】

    打开查看web的starter导入了哪些东西

    在这里插入图片描述

    就是第三个了,可以看到它也是一个starter,再次进入

    在这里插入图片描述

    圈出来的是个核心坐标,tomcat-embed-core ,称之为Tomcat 内嵌核心。

    就是这个坐标将Tomcat 的功能引入到了我们的程序中。

    【内嵌Tomcat 运行原理】

    Tomcat服务器是一款软件,而且是一款使用java语言开发的软件,tomcat安装目录中保存有jar,好多个jar。

    在这里插入图片描述

    tomcat服务器运行其实是以对象的形式在Spring容器中运行的,这就是就算我们没有安装tomcat,但是还能使用的原因。

    Tomcat 以一个对象的形式存在,保存在Spring容器中悄悄运行。

    具体运行的是什么呢?其实就是上前面提到的那个tomcat内嵌核心

    在这里插入图片描述

    如果我们把这个对象从Spring 容器去掉,

    通过排除依赖实现

    在这里插入图片描述

    刷一下,再次启动试试

    在这里插入图片描述

    这次直接就停掉了。

    【更换内嵌Tomcat】

    SpringBoot 提供了3款 内置的服务器。

    • Tomcat(默认):Apache 出品,粉丝多,应用面广,负载了若干较重的组件
    • jetty:更轻量,负载性能远不及Tomcat
    • undertow:负载性能勉强跑赢Tomcat

    想用哪个,加个坐标就OK。前提是把tomcat排除掉,因为tomcat是默认加载的。

    
        org.springframework.boot
        spring-boot-starter-jetty
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    就是这样。现在就已经成功替换了web服务器,核心思想就是用什么加入对应坐标就可以了。如果有starter,优先使用starter。

  • 相关阅读:
    拒绝加班:巧用前端电子表格中构建公式树
    linux套接字-Socket
    Android 9.0系统源码_SystemUI(一)SystemUI的启动流程
    nested exception is java.io.FileNotFoundException
    云计算介绍
    Sublime和iTerm中使用FiraCode编程连字等宽字体的配置
    机器学习整理(神经网络)
    JAVA基础(三十四)——异常处理
    7个有用的Jupyter扩展
    多线程基础篇
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127696520