· 一、SpringBoot的介绍

它并没有提供新的技术,只是提供了一种快速构建Spring的方式,它基于约定优于配置的思想,可以让开发人员不必在配置和业务逻辑之间切换,全身心的投入代码的编写中

1.1spring使用过程中的缺点

  • 配置繁琐
  • 依赖繁琐

    1.2SpringBoot对应的解决方法

  • 自动配置:SpringBoot的自动配置时运行时,考虑众多因素来确定使用那些配置

  • 起步依赖:为了解决一些Maven导入坐标出现的jar冲突,SpringBoot提供一些具有一定功能的坐标
  • 辅助功能:提供了一些大型项目中常见的非功能性特性,如嵌入式服务器,安全指标健康检查等

总结:SpringBoot并不是对Spring进行功能上的增强,而是提供了一种快速使用Spring的一种方式

二SpringBoot的快速入门

通过IDEA可以快速构建SpringBoot的项目

  1. SpringBoot的父工程依赖
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.1.5.RELEASE</version>
  6. <relativePath/> <!-- lookup parent from repository -->
  7. </parent>

三、SpringBoot起步依赖原理分析

起步依赖一:Spring-Boot-start-parent:在我们创建SpringBoot工程的时候,需要依赖SpringBoot提供的一个父工程,这个父工程,对一些我们需要使用的Jar进行了版本锁定,这样我们导入坐标的时候就可以不用指定坐标信息,同时这些版本也是进行系统配置的,不会出现依赖冲突问题
起步依赖二:Spring-boot-Start-web:这坐标是我们做Web开发的时候需要导入的,这个坐标包含了我们做Web开发需要的Jar包,我们不需要自己导入, 防止了配置冲突
总结:SpringBoot起步依赖主要是两个方面,第一方面它定义了大部分技术的版本信息,组合了一套最优的技术搭配,我们这搭建工程的时候只需要引入这个父工程,这样就可以不需要关注版本信息,来避免版本冲突,
另一方面:提供了很多start的依赖,这个这些start依赖中定义了完成该功能需要的坐标合集,这样我们只需要引入这一个坐标即可完成响应的功能

四、SpringBoot的配置文件

SpringBoot配置文件分类.jpg
注意:配置文件的优先级是properties>yml>yaml,如果我们高优先级和低优先级配置了相同的配置,那么会先加载高优先级的,低优先级的该配置不会加载,如果高优先的配置文件中没有该配置,那么低优先级的才会加载该配置,默认的配置文件名是application

4.1、yaml/yml配置文件语法分类

yaml语法格式.jpg
注意在同一yaml文件中不能配置两个键是一样的,如果需要给key继续加其他值,直接在下面利用层级关系,继续写即可,yaml配置的参数引用,使用${参数的Key},在我们定义其他参数值时,需要引用上面已经定义好的参数值,可以使用参数引用,提高复用性

4.2、读取yml文件中自定义的数据

这个就是我们在使用Spring的时候,读取Spring中的配置的变量,使用@Value注解,SpringBoot提供了三种方式

  • @Value

    @Value("${name}")//这里的${里面是我们要取的值的key,这里是获取map格式的值}
    private String test;
    @Value("${person.age}")//这里是获取Person对象的age的属性值
    private String test1;
    @Value("${address[0]}")//这里是获取数组中的第一个元素
    private String test2;
    //纯量的值获取和map的获取方式是一样的
    
  • Environment

    //使用@Value注解注入值,如果值很多,注入很麻烦,SpringBoot在启动的时候会初始化一个org.springframework.core.env.Environment对象,我们获取获取配置文件中定义的属性时只需要,注入这个对象即可,使用获取
    @Autowired
    private Environment env;
    //获取值的方式
    env.getProperty("address[0]");//这里获取值的key和@Value中${}表达式中的一样
    
  • @ConfigurationProperties

    //之前我们使用@Value都是单个将对象的某个属性值注入给成员变量,通过@ConfigurationProperties注解,我们可以直接将配置文件中的对象直接注入给我们的对象,注意我们在注入的时候要加入前缀,@ConfigurationProperties(prefix="person")//将Person这个对象属性赋给我定义Java对象
    @Component
    @ConfigurationProperties(prefix="person")
    public class Person{
      private String name;
      private String age;
      //GET/SET...
    }
    

    4.3、SpringBoot使用prefile配置项目启动时的环境

    方式一:通过prefile方式来激活不同环境,实现切换配置文件
    首先我们配置多个配置文件来区分多个环境,不同环境配置文件必须是application-开头,后面根据不同环境加不同的后缀,例如application-dev.yml等而,我们使用spring.prefiles.active=dev(这里的dev是配置文件的后缀名),来激活使用那个环境的配置文件,这是在多个文件中配置,我们也可以在一个配置文件中,使用分割符来区分不同的环境,激活方式和上面相同。 ```yaml


server: port: 8081 spring:

profiles: dev #给每种配置起名字

server: port: 8082 spring:

profiles: dev

激活我们需要的环境配置

server: port: 8083 spring: profiles: active: dev

方式二使用虚拟机参数来切换<br />注意:虚拟参数都是-D开头,后面加你需要传递的参数,例如-Dspring.profiles.active=dev<br />而命令行开头是--,所以我们可以使用命令行的方式切换--spring.profiles.active=dev<br />![spring命令行启动.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/21719173/1629629407629-7b45bddc-7e85-4102-9b4b-b9ec688ef673.jpeg#height=861&id=JIPKT&margin=%5Bobject%20Object%5D&name=spring%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%90%AF%E5%8A%A8.jpg&originHeight=861&originWidth=1366&originalType=binary&ratio=1&size=185894&status=done&style=none&width=1366)<br />**总结:prefile配置是用来指定我们项目启动时所使用的环境**<br />![springboot内部配置文件的加载顺序.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/21719173/1629631804106-81d460c3-18b3-4926-a678-af76a42b8a40.jpeg#height=475&id=QI66X&margin=%5Bobject%20Object%5D&name=springboot%E5%86%85%E9%83%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%8A%A0%E8%BD%BD%E9%A1%BA%E5%BA%8F.jpg&originHeight=475&originWidth=1118&originalType=binary&ratio=1&size=73350&status=done&style=none&width=1118)<br />注意这些配置文件位置不同,导致他们的优先级不同,但是他们都会被加载,只是优先级高的会覆盖优先级低的<br />server.servlet.context-path=/test,这个配置是用来指定项目访问的根路径,如果加了,表示我们在使用IP:端口/test这才能访问项目的根路径,我们通过命令行的方式可以指定很多参数,中间用空格隔开即可例如:java  -jar  springboot.jar   --server.port=8081 --server.servlet.context-path=/test,如果配置文件过多,那么这样写很麻烦,我们可以写一个配置文件放入指定位置,然后启动的时候使用--spring.config.location=配置文件的绝对路径,即可在项目启动时加载配置文件,这样加载配置文件也是要写命令含参数,如果我们将配置放在和jar包同级也叫application.properties或者,在同级的config目录名字一样,会默认加载
<a name="4ivAm"></a>
### 五、Spring整合其他框架
<a name="qxyDf"></a>
#### 5.1、SpringBoot整合junit框架

- 导入start-test起步依赖
- 在测试类上加@Runwith(SpringRunner.class)和@SpringBootTest(classes=启动类.class)
<a name="kxmIZ"></a>
#### 5.2、SpringBoot整合Mybatis
<a name="bOZB0"></a>
#### 5.3、SpringBoot整合Redis
他们整合很方便,我们不需要进行繁杂的配置,只需要导入对应的starter坐标就可以了,他们都会有默认值,需要改动的则在yaml中进行改动,且有提示
<a name="V8hW5"></a>
### 六、SpringBoot的原理分析
<a name="4aV14"></a>
#### 6.1、SpringBoot的自动配置
在Spring4.0的时候加入了条件判断功能Condition,可以实现选择性的创建Bean,这个注解传入一个Conditional的子类,重写match方法,如果返回true就创建这个bean,如果返回false就不创建这个Bean,Springboot的自动配置就是利用这个功能,SpringBoot提供了很多@Condition注解,有根据property创建Bean,根据Bean创建Bean,根据字节码创建Bean的, 等等
<a name="3YIPK"></a>
#### 6.2、springboot切换内部服务器
SpringBoot的web环境默认使用的tomcat作为内部服务器,其实SpringBoot提供了四种内置服务器供我们选择,我们可以方便的切换<br />在SpringBoot源码中,有embedded这包,这个包下面提供了SpringBoot支持的Web服务器,这个类上加了@ConditionOnClass注解,也就是说有了对象字节码文件(导入坐标),才会初始化这个Bean,由于Springboot-starter-web这个坐标内部依赖了Tomcat坐标,所以默认启动的Tomcat服务器,所以切换服务器就是排除tomcat的坐标,引入其他坐标
```xml
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
<!--        引入springBoot提供的jetty-->
        <dependency>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>

自动配置原理分析:
@ComponentScan这个注解是扫描引导类所在的包何其子包,但是没法扫描到jar包中定义的Bean,如果想加载必须手动扫描jar包中的子包,但是这种方式不能用,所以使用@Import注解加载配置类,这些加载的都会被加入Spring的IOC容器,并被创建,这样我们就能导入jar包中的配置类,从而加载jar包中的Bean,SpringBoot的@Enable*注解底层就是用的@Import这个注解

6.4@Import注解的用法

Import注解的使用.jpg
功能三:导入ImportSelector的实现类,ImportSelector这是一个接口,它有一个selectImports方法,这个方法的返回值是一个字符串数组,将来我们需要实现这个抽象方法,需要返回类的全限定类名集合,那么通过导入我们自定义的这个类,就可以加载这个方法返回的全限定类名的bean到IOC容器中,这个的好处是我们可以将需要加载到IOC容器中的Bean提前加入到配置文件中,这样就可以动态的加载Bean对象
功能四:导入ImportBeanDefinitionRegistrar的实现类,这个接口有一个registerBeanDefinitions方法,我们可以实现这个方法,来注册Bean到IOC容器,同时指定Bean的名称
6.5、SpringBoot的自动配置的核心注解:@EnableAutoConfiguration,这个注解通过@Import注解导入了AutoConfigurationImportSelector,使用Import的第三个功能导入Bean
SpringBoot自动配置的原理.jpg

七、SpringBoot的监听机制

7.1、SpringBoot的监听机制是对Java提供的监听机制的一种封装
java监听机制简介.jpg
SpringBoot提供的监听器,它提前提供了一些监听器,我们只需要实现对应的监听器接口,重写方法就可以再监听事件触发后执行方法
1.ApplicationRunner接口:重写run方法,在SpringBoot项目启动的时候执行Run方法
2.CommandLineRunner接口:重写run方法,在SpringBoot项目启动的时候执行Run方法
这两个接口的run方法的参数都是我们在启动SpringBoot项目是,传递的虚拟机参数
我们可以利用这两个监听器实现项目启动后加载缓存的功能
3.ApplicationContextInitializer这个监听器接口,我们自己定义的监听实现这个接口不会被执行,需要在resources目录下建立META-INF这个目录,在这个目录下创建spring.fatories文件,这个文件是SpringBoot项目启动时自动扫描的,SpringBoot的自动配置就是扫描这个文件,我们需要将ApplicationContextInitializer这个接口的全限定类名作为key,value是我们创建监听器的全限定类名,才会加载我们自定义的监听器,执行我们重写的initial()方法,他会在SpringIOC容器加载之前执行,我们可以在利用这个监听器来检测一下文件是否存在
4.SpringApplicationRunListener这个监听器和3.类似,这个接口的实现类需要提供一个构造器,可以参照其他实现类去写,这个监听器提供了很多SpringBoot启动生命周期的方法

八、SpringBoot启动流程分析

SpringBoot启动流程.png

九、SpringBoot的监控

SpringBoot自带了监控功能Actuator,可以帮我们实现对程序内部运行情况进行监控,监控状况,Bean的加载情况,配置属性,日志等信息等
使用步骤:
SpringBootactuator监控的使用.jpg
SpringBoot的监控配置.jpg
开启后就查看所有的监控信息,例如加载的Bean等
对于Spring提供的监控信息都是以JSON的格式,需要我们解析,有一个开源的项目叫SpringBootAdmin,可以提供图形化的方式解析
SpringBootAdmin介绍.jpg

SpringBootAdmin使用.jpg
在client配置文件中,需要加spring.boot.admin.client.url=http://localhost:9000(Server服务的地址),这个Server也是获取client的信息,解析JSOn,通过图形化的方式展示出来,所以我们Client配置展示什么信息,Server才会 会有什么信息展示

十、SpringBoot项目的部署

1.SpringBoot支持两种方式部署

  • 方式一:jar包的方式部署(官方推荐)
  • 方式二:war包

我们通过Maven插件,默认的是打Jar包,通过java -jar 可启动这个jar包,使用的是SpringBoot内置的Tomcat服务器
打war包
SpringBoot打war包的方式.jpg
第一步:继承SpringBootServletInitializer类,重写configure方法
第二步:更改pom文件中的打包方式为war(使用war)
SpringBoot打war包的方式.jpg
将打好的war包放入tomcat的webapp目录下,启动Tomcat即可,它会将打成war包解压成SpringBoot目录中,我们访问路径需要加SpringBoot,即虚拟目录是SpringBoot,注意我们通过Tomcat发布War,启动的是外置的Tomcat,项目的端口就是外置Tomcat的端口,我们配置文件中配置的端口就不生效了