2、SpringBoot入门案例解析

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、知识总结










浙公网安备 33010602011771号