2、SpringBoot入门案例解析

入门案例解析

1、SpringBoot对比原始的Spring

2、原理解析(parent)

2.1、pom.xml配置文件(parent)

1、Spring开发的时候,pom.xml是不是要导入很多相同的依赖?

之前开发Spring的时候,我们只要创建一个新的项目,比如我做一个web项目,那我导入的包基本都是web相关的,也会有Spring的依赖,是不是只要我新建项目,这些过程我都需要走一遍?不想这么麻烦怎么办?可以整合在一起吗?当然可以,于是有了图2

2、抽取,整合

项目A和B共用这一个就行了,可以吗?当然可以,上面那个抽取是Maven底层的配置,我还没有自习了解过

3、版本集中管理,坐标集中管理(解耦合)

将抽取出来的依赖项,版本号(version)进行集中地管理,坐标(xxx)进行集中的管理,将用过的这些版本统一管理,配置成Maven的属性,右边这一块直接引用配置好的坐标就行,只需要进行坐标管理,不进行版本的管理

4、还是不够简化,直接把常用的版本整合在一起

这样将所有能用的坐标挨个列一遍,这样就不需要去管版本和坐标的问题了,这些东西别人已经给我们做好了,我们只需要引用就行

2.2、SpringBoot如何做到的?

1、我们导入一个Servlet的坐标

  • 不写版本号,导入Servlet的坐标

  • <!-- 测试parent -->
    <!-- Servilet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
    </dependency>
  • 我们查看一下当前的项目里面有那些包?

    • 目前只有两个

  • 我们点击刷新

他已经自动帮我们导入完成了,并且告诉你,这个版本最稳定

2、如何做到的?依赖于父项目---spring-boot-starter-parent

  • 我们点进去看看--进入spring-boot-starter-parent

    • 他又继承了一个父类,点进去看看

  • 进入spring-boot-dependencies

    • 在这个文件我们就看到了统一管理的版本号

  • 查看一下我们刚刚使用过的版本号--servlet-api

    • 是不是4.0.1

3、我也没写版本号(version(${xxx.xxx})啊,他是怎么给我引用的?

  • 往下看,找到dependency这个标签

  • 他在这里给我们引用了上面定义好的坐标

  • 我们查看下我们导入的servlet

确实,也就是说properties标签和dependency标签分别为我们做了版本管理和依赖管理,所以我在导入坐标的时候就不需要指定版本了

4、总结

spring-boot-starter-parent他继承了spring-boot-dependencies,它定义了多个properties属性,同时定义了若干个坐标管理,引用他自定义的那些属性,当我们在使用的时候,我们只需要引入坐标,不需要写版本

我们所使用的这些依赖的版本是什么,取决于我们的SpringBoot使用的版本,例如2.5.4和2.5.3内部配置的东西就会有差别,这是肯定的

 

3、原理解析(starter)

stater其实就是一个导入了若干个坐标定义的pom管理文件,如果一个stater内容下包含了其他的stater,那么这个stater下也可能引入了其他的若干个坐标定义的pom文件

3.1、查看spring-boot-starter-web

  • 我们点进去(spring-boot-starter-web)

    • 直接看它的dependency

  • 因为它导入了这些坐标,那我还需要导入嘛?不需要

    • A依赖于B,而B依赖于C。。。。。。所以我A想用C的功能还需要导入C的坐标吗?

    • 不需要

  • 我们点一个带有startet的包看看(spring-boot-starter-tomcat)、

    • 他这里面又导入了一堆东西

所以,我们可以通过starter来实现我们快速的配置,当然目前讲的只是它功能很小的一部分,我们在SpringBoot当中使用的坐标基本都是一个又一个大饼,大饼里面包含了很多很多的小饼,以前我开发项目A我需要导入20个坐标,那么现在我再次开发项目A使用SpringBoot来做,那么只需要导入一个坐标就行,因为剩下的坐标,他已经帮我导入好了

3.2、starter和parent的区别

starter是把他这个内部的坐标给你导入好了,直接用就行,以前导入10个现在导入1个,达到减少配置的目的

parent是把一大坨依赖进行集中管理,只定义了,但是不用,并且规定了版本号,就是你是使用的那个功能,哪个版本最好用,我给你弄好了,你直接写坐标就行,不用写版本

真正要使用,还是要看以starter内容或者我们手动导入的坐标为主

会遇到springboot中没有规划好的版本,确实会遇到,刚刚我用mybatis就遇到了,这种时候只能回归最原始的方式去使用了,相信日后会将这些常用的功能作统一的规划的,springboot--yyds

3.3、总结

他俩解决了配置的问题,那么程序真正跑起来,是怎么做到的?

4、原理解析(引导类)--Application结尾的类

抛出一个问题,我们在运行Spring或者是SpringBoot的时候,是不是最后都会运行出来一个Spring容器的对象?我的所有对象都以Bean的形式交给Spring的容器对象帮我们进行自动化的管理,我们做SpringBoot项目,会没有这个Spring的容器吗?屁话!当然有

4.1、xxxxxApplication类

  • 他运行的就是一个容器,我们把他的局部变量拿来看看

    • 这个几把毛拆开后面那一坨是不是就是我们的上下文对象--容器对象

  • 我是不是可以通过这个app对象去获取Bean?

  • 我们有Bean吗?有,控制类吗(@RestController)

    • public static void main(String[] args) {
          ConfigurableApplicationContext app =
                  SpringApplication.run(Demo1SpringbootQuickstarApplication.class, args);
          // 把Bean拿出来看看能不能打印,他是否帮我们自动注入到容器当中了?
          HelloController helloController =
                  (HelloController) app.getBean("helloController");
          // 打印
          System.out.println(helloController);
      }
  • 查看结果

这就是一个Bean,我们是从Spring的容器当中拿出来的!这个main方法启动就是加载了一个spring的容器对象

4.2、@SpringBootApplication简单了解

  • 点进去看看

    • 这里有一大坨注解

  • 进入SpringBootConfiguration看看--配置类嘛

    • 说明这玩意儿就是个配置类

  • 然后我们看看点进去之前的

4.3、@ComponentScan

他是个什么意思?扫描Bean

Filter,过滤器嘛,这里面表示的是一个排除过滤器的规则

当我们没有指定任何包的时候,Spring扫描的是什么?默认扫描这个配置类所在包及其子包!所以以前就有人打过预防针,不要再这个配置类(xxxxxApplication)的父级目录上定义Bean,不然扫描不到,原来是这个意思

  • 我当前这个配置类的包是什么?

    • 没错!waves

  • 所以它可以扫描到waves包内的所有组件

4.4、总结

这个类是引导类,是整个Boot工程的执行入口,运行这个main方法就行,运行完之后会得到一个Spring容器,Boot初始化Spring容器,然后扫描这个类所在包及其子包,加载我们配置的Bean,进行我们项目的运行

SpringBoot还是基于Spring那一套开发来的,但是大部分配置都帮我们简化了,YYDS!

5、辅助功能--内嵌Tomcat

之前在spring-boot-starter-web中我们看到了tomcat的依赖

点进去看之后

5.1、内嵌tomcat核心

  • 它内部就是一个配置文件

tomcat注解接口?

内嵌的tomcat核心,我们现在启动起来这个服务器,之所以能用,就是因为这里面内嵌了一个tomcat服务器,程序里面包含了一个服务器?服务器启动起来不是要把程序扔到服务器里面吗?现在怎么把服务器扔到程序里面去了?

不能这么想,tomcat服务器是用java语言写的,里面有很多jar包,如果是那java语言写的,java是用什么运行的?是不是对象?如果用对象去运行的话,这个对象能不能交给spring去管理呢?

他将tomcat容器的执行过程,抽取出来,变成一个对象,交给spring容器去管理,现在就变成了spring容器当中有一个tomcat对象,你现在要运行的所有东西要放在tomcat当中去运行?

这就是我们程序没有安装tomcat服务器,还能启动起来,带tomcat的原因

能用tomcat,可以不用嘛

5.2、流程图

  • 1、spring-boot-stater-web内部导入了一个坐标

  • 2、导入了一个starter-tomcat的坐标

    • 可以吧tomcat的容器以对象的形式在spring容器中运行起来

  • 3、是他运行吗?不是的

    • 是它内部的这个tomcat内嵌核心运行的

5.3、替换功能流程图

5.4、内置服务器--简单了解

5.5、知识总结

posted @ 2022-05-16 21:05  澜璨  阅读(180)  评论(0)    收藏  举报