SpringBoot学习

黑马视频的学习

  • 一、基础篇
    • 1.1、starter标签
    • 1.2、parent标签
    • 1.3、springBoot程序的启动方式
    • 1.4、springBoot的辅助功能
    • 1.5、REST风格回顾
    • 1.6、properties文件格式的属性配置
    • 1.7、yaml【yml】文件格式的属性配置
    • 1.8、属性提示消失的解决方案
      • 1.8.1、yaml文件书写格式
      • 1.8.2、yaml文件数据的读取
    • 1.9、springBoot集成junit
      • 1.9.1、利用idea创建项目时自动集成
      • 1.9.2、手动集成junit
    • 1.10、springBoot集成mybatis
    • 1.11、springBoot整合Mybatis-Plus
    • 1.12、springBoot整合Druid
    • 整合第三方技术的通用方式
    • 1.13、SSMP整合案例
      • 1.13.1、前期准备工作
      • 1.13.2、数据层开发——分页功能
  • 二、运维实用篇
    • 2.1、工程打包与运行
      • 2.1.1、windows版本
      • 2.1.2、项目运行后可能会出现的问题
      • 2.1.2、Linux版本
    • 2.2、临时属性配置
    • 2.3、 配置文件的优先级
    • 2.4、配置文件四级分类
    • 2.5、多环境开发
      • 2.5.1、多环境开发,单个YAML文件版本
      • 2.5.2、多环境开发,多个YAML文件版本
      • 2.5.3、多环境开发,多个properties文件版本
      • 2.5.4、多环境配置文件书写技巧
    • 2.6、Maven与SpringBoot多环境兼容
  • 三、springBoot开发实用篇
    • 3.1、热部署
      • 3.1.1、手工启动热部署
      • 3.1.2、自动启动热部署
      • 3.1.3、热部署范围控制
      • 3.1.4、关闭热部署
    • 3.2、第三方Bean属性的绑定
    • 3.3、宽松绑定
    • 3.4、常用计量单位
    • 3.5、开启Bean的数据校验
    • 3.6、测试模块
      • 3.6.1、加载测试专用属性
      • 3.6.2、web环境模拟测试
      • 3.6.3、数据层测试事务回滚
      • 3.6.4、测试用例数据的随机生成
    • 3.7、配置JDBCTemplate
    • 3.8、SpringBoot相关的内嵌数据库
  • 四、NoSql
    • 4.1、Redis安装和简单使用
      • 4.1.1、Redis的下载安装(Windows)
      • 4.1.2、Redis的启动
      • 4.1.3、Redis的简单使用
    • 4.2、SpringBoot整合Redis
    • 4.3、springBoot整合Mongodb
      • 4.3.1、安装Mongodb,
      • 4.3.2、Mongodb的可视化操作软件
      • 4.3.3、可视化操作软件的操作
    • 4.3、springBoot整合Mongodb
  • 五、缓存
    • 5.1、springBoot整合ES
      • 5.1.1、ES的下载和安装
      • 5.1.2、ES的简单使用
    • 5.1.3、springBoot整合ES
    • 5.2、缓存的使用
      • 5.2.1、缓存的介绍
      • 5.2.2、springBoot整合Simple缓存
      • 5.2.3、springBoot整合Ehcache缓存
      • 5.2.4、不同淘汰策略的区分
      • 5.2.4、缓存供应商改为Redis
      • 5.2.5、安装memcached
      • 5.2.6、缓存供应商变为memcached
      • 5.2.7、缓存供应商变为jetcache
        • 5.2.7.1、远程缓存
        • 5.2.7.2、本地缓存,
      • 5.2.8、启用方法注解步骤,
  • 六、原理篇
    • 6.1、自动配置
      • 6.1.1、bean加载方式
      • 6.1.2、bean加载配置
      • 6.1.3、依赖属性配置
      • 6.1.4、自动配置原理
        • 6.1.4.1、自定义starter
        • 6.1.4.2、完善功能一——开启定时功能
        • 6.4.3、完善功能二——添加yaml属性配置
        • 6.4.1.4、功能完善三——使用属性修改自动配置加载的设置值。
        • 6.4.1.5、功能完善四——自定义拦截器
        • 6.4.1.5、功能完善五——yaml自动提示
    • 6.2、

一、基础篇

1.1、starter标签

  • 在传统ssm开发时,需要什么坐标往往需要开发人员自己导入,十分麻烦。而springBoot将每个模块需要的坐标都已经导入,从而避免开发人员自己去导入。
  • 在开发SpringBoot程序时,需要导入坐标时通常导入对应的starter。每个不同的starter根据功能不同,通常包含多个依赖坐标,而使用starter可以快速实现配置效果,达到简化配置的目的。
    SpringBoot学习_第1张图片

1.2、parent标签

  • 在刚开始学习ssm时,需要什么坐标往往需要开发人员自己导入,但是每个坐标往往有很多版本,所以在使用的版本不合适时就会发生版本冲突。而springBoot程序在底层导入坐标时就将合适的版本的坐标进行封装在一起,以达到减少版本冲突的问题。
    SpringBoot学习_第2张图片

1.3、springBoot程序的启动方式

  • springBoot程序是由引导类来进行启动的,运行main方法即可。引导类写法如下如图所示:注意引导类所属的包
    SpringBoot学习_第3张图片

1.4、springBoot的辅助功能

  • 下面以tomcat辅助功能进行讲解
    SpringBoot学习_第4张图片

1.5、REST风格回顾

回头还得再看,自己对这一块理解存在问题
SpringBoot学习_第5张图片
SpringBoot学习_第6张图片
SpringBoot学习_第7张图片
SpringBoot学习_第8张图片

  • 传统写法,在方法加上@RequestMapper注解,并在该注解里面加上相应的属性。但是,这种写法会让人觉得该类很繁琐,不简洁。
    SpringBoot学习_第9张图片
  • 共性抽取:
    (1)如果该类里面的所有方法的返回值都不是用来进行页面跳转,则可以将@ResponseBody抽取出来放到类上。但是类上会有一个注解@Controller,而@Controller + @ResponseBody就等价于@RestController。所以就用该注解来替代上面的两个注解。
    SpringBoot学习_第10张图片
    (2)如果每个方法的@RequestMapper的value值有相同部分,则可以将相同部分抽取出来放到类上,即就是给类上添加一个@RequestMapper注解,将相同部分放进去即可。
    (3)将@RequestMapper里面提交方式改成对应的注解,如果在value值的相同部分抽取完后还剩下不同的部分,则可以将不同的部分放到对应的提交方法的注解里面。常见的方法注解:如下图所示:
    SpringBoot学习_第11张图片

1.6、properties文件格式的属性配置

  • 在springboot中,默认的配置文件是application.properties文件,想要修改属性值只需在里面进行修改即可。如下所示:
# 修改tomcat的端口
server.port=80

# 更改启动时输出框里面的图片
spring.banner.image.location=resources/1.jpeg

#关闭启动时输出框的图片
spring.main.banner-mode=off

但是肯定会有人问,那我如果不知道这个键的情况下怎么去知道这个是这样写的呢?让我来告诉你,打开spring的官网,找到srpingBoot这个项目,然后打开这个项目的文档找到Application Properties选项就行,具体的链接。打开后如下图所示,左边就是键值,右边就是相应的说明。
SpringBoot学习_第12张图片

1.7、yaml【yml】文件格式的属性配置

  • 上面在properties文件里配置感觉很方便,但是仔细想一想,他的文件格式都是左对齐。如果配置很多的情况下,看起来就没有任何层次感觉会很晕,于是就有了另外一种配置文件,yaml配置文件。【这种配置格式现在是主流。】
#配置静态资源访问前缀
spring:
  mvc:
    static-path-pattern: /res/**

#配置静态文件夹,一旦配置这个后,那些默认的静态文件就不再起作用了。
  web:
    resources:
      static-locations: [classpath:/haha/]
  • 当properties文件、yml文件、yaml文件三者共存时,properties文件优先级最高,yaml优先级最低。也就是说,如果三个文件里对同一个属性进行配置,优先级最高的会覆盖优先级低的。【我们常用的配置文件格式是yml】

1.8、属性提示消失的解决方案

  • 在idea里面写配置时,一般会有对应的提示,如果提示消失就可以参考下面的视频进行解决。
  • 解决视频链接

1.8.1、yaml文件书写格式

  • 字面值表示方式:(字面值就是指该类型不能在进行分割,比如int类型,就不能在进行分割。而自定义的类里面可能还有多个属性,则可以进行分割),具体例子如下图所示:
    SpringBoot学习_第13张图片
  • 数组表示方式:
    SpringBoot学习_第14张图片
  • 共性的抽取:如果yaml文件里面有一部分键所对应的值是相同的,则可以进行抽取。具体实例参见下图:
"下面的例子就出现重复部分"
center: 
  dir1: c:/str/main/date
  dir2: c:/str/main/img
  dir3: c:str/main/music
  
"对重复部分进行抽取,这样在维护时会更加方便"
date: c:/str/main

center: 
  dir1: ${date}/date
  dir2: ${date}/img
  dir3: ${date}/music

SpringBoot学习_第15张图片

  • 其他常见集合类型数据的表示方式,以及yaml文件的语法说明,请看我的另外一篇博客,博客链接

1.8.2、yaml文件数据的读取

  • 方式一:在属性上面使用@Value注解,具体使用方式参见下图。但是前提别忘了先将该类添加到Bean容器里面。注意数组类型数据的读取
    SpringBoot学习_第16张图片
  • 方式二:将yaml文件里面的所有数据使用@Autowired都装配到Evironment对象里面。然后利用该对象对数据进行读取。具体的封装、以及读取方式,请参考下图:
    SpringBoot学习_第17张图片
  • 方式三:自定以对象封装指定数据,具体操作如下图所示:注意:别忘了类上面的注解,以及注解里面的属性。其次,别忘了写get和set方法,如果不想写可以加上@Data

SpringBoot学习_第18张图片

  • 第三种方式的注意事项
    SpringBoot学习_第19张图片

1.9、springBoot集成junit

1.9.1、利用idea创建项目时自动集成

  • 当利用idea自动生成一个springboot项目时,其实已经将junit集成好了。但是还是有一些需要注意的地方。
  • 注意
    • 在test目录下集成junit环境的类所在的包结构要和springBoot启动类所属的包结构一致。如果不一致,则需要在集成junit的类上的@SpringBootTest注解里面添加上启动类的类类型。如下图所示:
      SpringBoot学习_第20张图片

1.9.2、手动集成junit

  • 第一步:先创建一个maven项目。
  • 第二步:配置pom文件,导入相应的坐标。
  • 第三步:在main目录下编写引导类,在test目录下编写测试类。(注意类的包结构)
  • 第四步:使用自动装配的方式添加要测试的对象。
  • 下面的图是用来方便自己理解,注意那些注解的使用
    SpringBoot学习_第21张图片
    SpringBoot学习_第22张图片
    SpringBoot学习_第23张图片
    SpringBoot学习_第24张图片

1.10、springBoot集成mybatis

  • 第一步:首先创建maven工程,将mybatis的starter和数据库驱动导入。
    SpringBoot学习_第25张图片
  • 第二步:在yaml文件里配置数据源参数
    SpringBoot学习_第26张图片
  • 第三步:创建dao层的Mapper接口。如果是使用mytabisPlus,则可以通过继承BaseMapper类从而进行数据库的相关操作,也可以自定义方法,进行相关的数据库据操作。
  • 注意事项:如果=运行之后报错,则按照下图提示进行更改。或者就将自己现在写的配置文件里面的内容直接复制即可。
    SpringBoot学习_第27张图片

1.11、springBoot整合Mybatis-Plus

  • 第一步:手动添加mybatis-plus的坐标(如下图)。或者利用阿里的镜像网站创建maven工程,因为spring的网站里面没有plus,而阿里的有。
    SpringBoot学习_第28张图片
  • 第二步:在yaml文件里面配置数据源
  • 第三步:定义数据层接口与映射配置,通过继承BaseMapper类,可以使用该类里面组多已经定义好的操作数据库的方法。也可以像在mybatis里面一样,在该类里面自己配置操作数据库的方法。
    SpringBoot学习_第29张图片

1.12、springBoot整合Druid

  • 第一步:在导入数据库坐标和mybatis或者plus坐标之后,再将druid坐标导入。
  • 第二步:配置Druid。如下图
    SpringBoot学习_第30张图片SpringBoot学习_第31张图片

整合第三方技术的通用方式

  • 首先导入对应的starter,
  • 然后进行相应的配置即可。

1.13、SSMP整合案例

1.13.1、前期准备工作

  • 首先创建maven工程,导入需要的坐标。
  • 编写配置文件
  • 为了调试方便,可以开启MyBatisPlus的日志信息。如下图
    SpringBoot学习_第32张图片

1.13.2、数据层开发——分页功能

  • 首先使用IPage类封装分页数据。
    SpringBoot学习_第33张图片
  • 分页操作依赖于Mybatis的分页连接器。所以需要编写Config配置类进行配置。如下图所示。
    SpringBoot学习_第34张图片
    SpringBoot学习_第35张图片

SpringBoot学习_第36张图片
SpringBoot学习_第37张图片
SpringBoot学习_第38张图片
SpringBoot学习_第39张图片

在这里插入图片描述
SpringBoot学习_第40张图片
SpringBoot学习_第41张图片
SpringBoot学习_第42张图片
SpringBoot学习_第43张图片
SpringBoot学习_第44张图片
SpringBoot学习_第45张图片

SpringBoot学习_第46张图片

SpringBoot学习_第47张图片
SpringBoot学习_第48张图片
SpringBoot学习_第49张图片
SpringBoot学习_第50张图片

SpringBoot学习_第51张图片
SpringBoot学习_第52张图片

二、运维实用篇

2.1、工程打包与运行

2.1.1、windows版本

  • 首先,在将项目调试好后,通过maven的clean功能将生成的target文件清除。然后再利用package功能进行打包。打包完成后会生成一个新的target目录,目录里面就有相应的项目jar。在ieda里面,右键该项目的jar,选择open in -> Explorer就会打开该文件所在的文件夹,然后在路径里面输入cmd,从而打开cmd环境。然后输入【java -jar 架包名称】即可开始运行该项目。
    SpringBoot学习_第53张图片

2.1.2、项目运行后可能会出现的问题

  • (1)项目启动之后,当你访问时可能会多出一些你之前没有添加的数据。那是因为项目在打包的时候会自动做一些测试,从而添加进去一些数据。为了避免该数据被添加去,可以将测试产生的数据进行销毁【具体怎么做下去得查】,或者在打包的时候直接将text功能给去掉。
  • (2)项目在启动时,可能会碰到项目启动失败。这个产生的主要原因就是因为在打包的时候将maven插件给去掉了。所以在打包的时候,不要为了节省空间,就将maven的插件去了。maven插件如下所示
	<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • (3)项目运行后,可能会出现端口占用的情况。这种情况出现后,要么更改服务器的端口,要么将占用该端口的服务给停止掉。下面就说说如何寻找占用端口的服务,并将其关闭。
1、查询指定的端口:netstat -ano |findstr "端口号"。
   通过该指令可以查看该端口的PID
2、根据PID杀死占用该端口的任务:taskkill /F /PID "PID号"

 "还有另外一种方式杀死任务"
2、根据PID查询进程名称:tasklist |findstr "进程PID"
3、根据进程名称杀死任务:taskkill -f -t -im "进程名称"

2.1.2、Linux版本

该部分等将linux配置好了再来总结

2.2、临时属性配置

  • 前面说到了在cmd环境下运行Springboot项目时。可以使用临时属性替换配置文件中的属性。如果需要写多个临时属性,则每个属性之间需要用空格分隔。如下图所示:
    SpringBoot学习_第54张图片

2.3、 配置文件的优先级

一个项目里面可能有properties配置文件配置的参数,也有可能有yaml配置文件配置的参数,也有可能是临时属性配置。当同一个属性在多个不同文件里面都有配置,且配置的参数不同时,到底是哪一个起作用?这里就不得不说属性加载优先顺序。配置属性的方式类型一共有下图中所列举的所有方式。属性加载顺序的链接
SpringBoot学习_第55张图片

  • 利用idea测试带临时属性启动SpringBoot程序。
    在这里插入图片描述
  • 主函数中的args的使用。通过输出可以看到,启动项目的临时属性值就在args里面保存着。所以一般为了安全起见,在运行引导程序时,不要将args作为参数传递进去。也就是说通过是否传递args,从而可以选择是否使用命令行属性为springBoot程序传递启动属性。
    SpringBoot学习_第56张图片

2.4、配置文件四级分类

  • 由于配置文件存在优先级,所以当不同等级的配置文件出现相同属性的配置时,处于高级的文件会覆盖优先级比较低的文件。一般情况下配置文件分优先级为四类。以下优先级:从低到高
    • 第四级:classpath: application.yml;一般服务于开发人员本机开发测试。
    • 第三级:classpath: config/application.yml;服务于项目经理整体调控。
    • 第二级:file:application.yml;服务于运维人员配置涉密线上环境。
    • 第一级:file:config/application.yml;服务于运维经理整体调控。
  • 注意:多层级配置文件间的属性采用叠加并覆盖的形式作用于程序。
    SpringBoot学习_第57张图片

2.5、多环境开发

2.5.1、多环境开发,单个YAML文件版本

  • 一个产品从研发到上线,需要在各种不同的环境中进行测试。例如:生产环境、开发环境、测试环境等等。在不同环境中对于同一属性可能设置的参数值不相同。例如下图,我们编写了三个环境,每个环境都对服务器的端口进行配置。但是在不同环境测试时,我们需要指定启动时所需要的环境。
		#应用环境:配置启动时所采用的环境。当前配置的是test环境。
		spring:
		  profiles:
		    active: test
		
		#设置环境
		---	#边界
		#生产环境
		spring:
		  config:
		    activate:
		      on-profile: pro # 环境名称
		server:
		  port: 8080
		---
		#开发环境
		spring:
		  config:
		    activate:
		      on-profile: dev
		server:
		  port: 8081
		---
		#测试环境
		spring:
		  config:
		    activate:
		      on-profile: test
		server:
		  port: 8082
  • 注意:在同一个yml文件里面配置多个环境时,每个环境之间需要用—区分环境设置边界。
    SpringBoot学习_第58张图片

2.5.2、多环境开发,多个YAML文件版本

  • 上面我们讲述了如何在同一个yaml文件里对多个环境进行配置。但是大家仔细想想,当在配置文件里面配置保密类的数据时,比如银行数据库的密码,那么大家都在操作同一份配置文件,从而就会造成银行密码被多个人员看见。因此在编写不同环境配置文件时,应该是每个环境的负责人自己编写自己的配置文件,然后在一个总文件里面调用其他人的配置文件。这就是yaml的多文件配置。
  • 多文件配置方式
(1)编写主启动配置文件:application.yml

"在编写环境分类配置文件时,需要注意命名格式:applicatio-自己起个名字.yaml"
(2)环境分类配置文件1:application-pro.yaml

(2)环境分类配置文件2:application-dev.yaml

(3)环境分类配置文件3:application-test.yaml
 "不同的测试人员,编写不同的环境分类文件,然后在测试时,只需要在主启动文件里面进行
 调用就行。注意:调用时,只需要在主启动文件中写入配置文件名称中自己起的那一部分就行。"
 .....

SpringBoot学习_第59张图片

  • 主配置文件中设置公共配置(全局)
  • 环境分类配置文件中常用于设置冲突属性(局部)

2.5.3、多环境开发,多个properties文件版本

  • 这个作用和上面的yaml文件作用一样。做法也和上面一样,建立一个主配置文件,其他都是由不同测试人员编写。注意文件名称格式,具体参考下图。
    SpringBoot学习_第60张图片

2.5.4、多环境配置文件书写技巧

  • (1)上面提到,为了安全起见,不同的测试人员会编写属于自己特有的测试文件。但是并不意味着该测试人员只编写一个测试文件,因为如果将所有的配置都写在同一个配置文件里面,那么将会写进去很多属性配置,后期维护会很困难。所以针对不同的第三方工具,我们会将他的配置写在不同的文件中去,因此在测试时可能需要导入多个配置文件。具体参照下图,注意命名规则。
    SpringBoot学习_第61张图片
  • 注意上面图片中的include,后面引入了三个配置文件,优先级最高的是最后面的,也就是说,当引入多个配置文件时,如果有对同一属性进行配置,那么生效的是最后面的那个。切记!!!
  • (2)上面的include在引入多个配置文件时,一次只能引入一个测人员所需的置文件。当下一个测试人员在测试时就需要再次编写,增加书写量。为了减少书写量,springboot开发人员引进了group,该标签一次可以引入多组配置文件。也就是说,可以一次性将所有测试人员需要的文件都写进来,从而在测试时,只需要=把自己需要的那组的配置文件的组名写在上面的启动环境中去。**具体做法参照下图。**这样做方便线上维护管理。
    SpringBoot学习_第62张图片

2.6、Maven与SpringBoot多环境兼容

  • 在多环境配置情况下,maven和springboot都有属于自己的配置文件,那么到底改用谁的呢?仔细想一下就可以知道,springboot依赖于maven,所以肯定是以maven为主。因此,我们需要在maven的pom中引入springboot的属性配置文件。具体引入参考下图,注意,在引入多组配置文件后,用那一组就在哪一组下面配置上true,具体使用参考下图。
    SpringBoot学习_第63张图片
    同时,需要在springboot的主配置文件中将active属性值配成下图所示的格式。z注意:这个@@中的内容需要和pom中的标签名称保持一致。并且pom中的这个标签名称是自己起的,不是规定好的。具体参考下图:
    SpringBoot学习_第64张图片
  • 使用这种配置的注意事项,尤其是第二条。
    SpringBoot学习_第65张图片

三、springBoot开发实用篇

3.1、热部署

  • 当我们在进行WEB开发时,每一次对后端代码进行更改都要重新启动服务器才可以访问到后台修改之后的功能。当我们测试后台代码时,往往会经常更改后端代码,也就需要频繁的重启服务器。所以为了减少这种操作开发人员研发出了热部署这一功能。
  • 注意: 热部署仅仅加载的是当前开发人员自定义开发的资源,不加载jar资源。

3.1.1、手工启动热部署

  • 第一步:在pom文件里面引入下图的坐标。
  • 第二步:使用快捷键Ctrl+F9。或者点击idea工具栏里面的Build->Build Project。
    SpringBoot学习_第66张图片

3.1.2、自动启动热部署

  • 上面我们提到了手动启动热部署。下面我们说说自动启动热部署。
  • 第一步:引入坐标和上面的一样
  • 第二步:勾选下图标注的红色部分。
    SpringBoot学习_第67张图片
  • 第三步:按Ctrl+Alt+Shoft+/ 打开下图所示的界面。
    SpringBoot学习_第68张图片
  • 第四步:点击Registry,进入下图所示的界面。并勾选红色标注的部分,close。
    SpringBoot学习_第69张图片
  • 以后当对后端代码进行修改后,只需要打开前端页面,在后端界面失去焦点五秒后就会自动重新加载。

3.1.3、热部署范围控制

  • 热部署不是对所有的文件都起作用,当更改后端代码后,在失去焦点5秒后会自动热启动。但是当更改下面所示的文件里面的内容后,失去焦点5秒不会进行热启动。
    SpringBoot学习_第70张图片
  • 但是如果需要在改变上图里面的代码后也进行热启动,那么就需要进行配置,具体配置参考下图:要给那个问价加上热启动,就将哪个文件的目录结构写在下面的配置里。
    SpringBoot学习_第71张图片

3.1.4、关闭热部署

SpringBoot学习_第72张图片

3.2、第三方Bean属性的绑定

  • 我们可以通过在yaml文件里面配置一个自定的类的属性值,然后再将值绑定到自定义的类上来使用。那么第三方的类可以吗?肯定是可以的。首先,我们得知道如何将第三方得类放到容器里面。通常一般情况下我们会写一个被@Configuration注解的类,专门用来将第三方类加载到容器里。然后在类里面写上对应的方法,该方法通过@Bean注解就可以将类注入到容器里面。然后再在该方法上添加上 @ConfigurationProperties(prefix = “datasource”)就可以将yaml文件里面的属性值添加到对于的类上。具体做法如下所示:
    SpringBoot学习_第73张图片
  • EnableConfigrationProperties注解的使用方法以及注意事项参考下图:
    SpringBoot学习_第74张图片
  • 使用 @ConfigurationProperties(prefix = “datasource”)注解后会出现一个红色警告。解决方法:只需要在pom文件里面添加该坐标就行。
    在这里插入图片描述

3.3、宽松绑定

  • 在使用@ConfigurationProperties注解来加载yaml文件属性值时,一般会在该注解上添加前缀(pre=“xxx”)。但是这个前缀的写法要特别注意,我也就不多说都有哪些写法了,记住用全小写就行,千万别用驼峰命名法。但是对应的yaml文件里面可以使用驼峰命名法。
  • 注意:@Value这个属性不能用宽松绑定,也就是说,yaml文件和该注解里面的值保持一致即可。
    SpringBoot学习_第75张图片

3.4、常用计量单位

  • 我们在配置文件里面一般配置时间时,不知道时间单位是什么。所以JDK8提供了时间和空间的计量单位。并且可以通过注解来配置单位。具体使用参考下图:
    在这里插入图片描述

3.5、开启Bean的数据校验

  • 首先,先来说说为什么要有数据校验。我们在写配置文件的时候,往往直接写,但是万一哪里写的数据类型不符合我们所配置的yaml配置文件也不会报错。所以,我们就需要对自己配置的数据进行校验。下面就来说说如何开启数据校验。
(1)第一步:首先,先导入坐标。
		<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
(2)第二步:对bean开启校验功能;
	在一个bean上使用@Validated注解。
	@Data
	@Configuration
	@ConfigurationProperties(prefix = "book")
	@Validated
	public class BookConfig {
	   
	}
(3)设置校验规则:校验规则有很多,这是其中的一个。

		@Max(value = 100, message = "最大不能超过100")
	    private int id;
	


3.6、测试模块

3.6.1、加载测试专用属性

  • 第一种:
    SpringBoot学习_第76张图片
  • 第二种:
    SpringBoot学习_第77张图片

3.6.2、web环境模拟测试

  • 在maven的测试模块里面,想要测试web功能比较麻烦。必须设置模拟环境。首先得在@SpringBootTest的注解里开启web测试环境如下图所示:
    SpringBoot学习_第78张图片
  • 第二步就是得使用@AutoConfigureMockMvc开启虚拟MVC调用。然后注入MVC调用对象,创建虚拟请求并执行。具体做法参考下图:
    SpringBoot学习_第79张图片
    SpringBoot学习_第80张图片
    SpringBoot学习_第81张图片
    SpringBoot学习_第82张图片
    SpringBoot学习_第83张图片
    SpringBoot学习_第84张图片

3.6.3、数据层测试事务回滚

  • 在将项目打包时,通常会运行这些测试类,从而将一些测试数据会写到数据库。为了不让这些测试数据写回到数据库,可以在测试类上添加一个@Transactional注解。从而避免数据回写到数据库。如果想让测试数据回到数据库,可以参考第二个图片。
    SpringBoot学习_第85张图片

3.6.4、测试用例数据的随机生成

  • 在测试时,往往不能只测一组数据。但是手动去改数据太繁琐,因此就有了随机生成这个技术。在配置数据时,配置成随机生成,就可以避免手动去改。具体配置如下图:
    SpringBoot学习_第86张图片

3.7、配置JDBCTemplate

  • 第一步:导坐标
    SpringBoot学习_第87张图片
  • 第二步:写测试
    SpringBoot学习_第88张图片
  • 相关得配置
    SpringBoot学习_第89张图片

3.8、SpringBoot相关的内嵌数据库

  • 内嵌数据库的种类。
    SpringBoot学习_第90张图片
  • 测试H2
  • 第一步:导入坐标,还需要导入web的坐标。
    SpringBoot学习_第91张图片
  • 第二步:配置参数
    在这里插入图片描述
  • 第三步:启动,在浏览器页面进行访问。访问成功后会出现 H2的页面。第一次连接时会出现一个小问题。但是只要在配置文件里面将H2的datasource数据配置上就可以解决了。
  • 注意事项:H2数据库仅用于开发测试阶段,发布到线上时一定要记着关闭。

四、NoSql

4.1、Redis安装和简单使用

4.1.1、Redis的下载安装(Windows)

  • 我安装的是5.0.14版本的Redis,下载链接。这个网页有时不太好打开。所以我将它放在网盘里。
  • 安装:傻瓜式安装。值得注意的是,有一步问你是否将他添加到环境变量中,最好选择添加。

4.1.2、Redis的启动

  • Redis分为客户端和服务端。首先先启动服务端,然后再启动客户端。具体操作参考下文。
  • cmd启动:找的Redis的安装目录,在地址栏里面输入cmd打开cmd环境。然后输入:redis-server.exe redis.windows.conf。但是不能成功启动,解决方案是,再在redis的安装目录里面输入cmd,然后输入:redis-cli.exe,回车,然后再输入shutdown,然后再exit。然后再去之前打开的cmd中输入:redis-server.exe redis.windows.conf。就可以正常打开。
    在这里插入图片描述

4.1.3、Redis的简单使用

  • 具体使用参考下图。
    SpringBoot学习_第92张图片

4.2、SpringBoot整合Redis

  • 前提是的先安装Redis;

  • 第一步:导入坐标
    SpringBoot学习_第93张图片

  • 第二步:进行配置
    SpringBoot学习_第94张图片

  • 第三步:进行测试
    SpringBoot学习_第95张图片
    SpringBoot学习_第96张图片

  • 在用cmd启动客户端时,通过set操作,存入了几组数据。但是在ieda中通过RedisTemplate操作get并不能获取到之前存入的数据。为了解决这个问题,于是就有了StringRedisTemplate。
    SpringBoot学习_第97张图片

  • redis
    SpringBoot学习_第98张图片

4.3、springBoot整合Mongodb

4.3.1、安装Mongodb,

  • 将Mongodb的解压文件直接放到自己要安装的目录文件里就行。但是需要注意的是,需要在安装目录里面自己创建一个存放数据的文件,我这里创建的是data/db。
  • 启动方式:在bin目录下,在地址栏里面输入cmd,然后输入:mongod --dbpath=…/data/db回车即可。

4.3.2、Mongodb的可视化操作软件

  • Robo3T。
  • 安装也是将解压文件放到安装目录下。然后找到roto3t.exe文件,创建快捷方式放到左面就行。但是在启动roto3t的时候,必须先启动Mongodb。

4.3.3、可视化操作软件的操作

SpringBoot学习_第99张图片
SpringBoot学习_第100张图片

4.3、springBoot整合Mongodb

  • 第一步:导坐标
    SpringBoot学习_第101张图片
  • 第二步:配置
    SpringBoot学习_第102张图片
  • 第三步:测试
    SpringBoot学习_第103张图片

五、缓存

5.1、springBoot整合ES

5.1.1、ES的下载和安装

  • 下载路径如下图所示;
  • 安装步骤:将下载的文件放到安装目录下解压即可。
  • 运行步骤:在bin目录里找到下图所示的文件,双击即可。
    SpringBoot学习_第104张图片

5.1.2、ES的简单使用

  • 下面的使用是在浏览器端操作时所使用的方式。通过输入以下的url从而可以创建、查询、删除索引。
    SpringBoot学习_第105张图片
  • 下面是索引的创建,通过配置相关的属性,从而实现相应的功能。注意下面的copy_to,这个的作用就是将该标签名下的内容复制到指定的字段里面,从而在搜索时,通过对该字段搜索,从而达到同时对多个字段进行检索。比如现在要同时搜索name和descoription字段是否包含spring关键字,只需要对all字段进行检索就行。注意的是all字段在数据库中并不真实存在。
    SpringBoot学习_第106张图片
  • 通过发送url生成相应的字段,
    SpringBoot学习_第107张图片
    SpringBoot学习_第108张图片
  • 注意下面的第一个修改方式,如果想要只修改name属性,在书写时必须要将type和descoription属性加上。不然修改后就会使得用name将这三个字段所有的内容都进行覆盖,只剩下修改后的name属性内容。但是如果你只想修改部分属性内容,可以参考这幅图片的第二部分,具体使用请参考下图
    SpringBoot学习_第109张图片

5.1.3、springBoot整合ES

注意:在使用通过Java操作ES的时候,必须要将ES打开。

  • 第一步:导坐标参考下图
  • 第二步:写配置参考下图
  • 第三步:编写客户端:但是下图所示的客户端是低版本的客户端,现在几乎不用了。所以请接着往下看高级客户端的使用方式。
    SpringBoot学习_第110张图片
  • 高级客户端的使用
  • 第一步:导入坐标,参考下图
  • 第二步:使用;
    SpringBoot学习_第111张图片
    SpringBoot学习_第112张图片
    SpringBoot学习_第113张图片
    SpringBoot学习_第114张图片

5.2、缓存的使用

5.2.1、缓存的介绍

SpringBoot学习_第115张图片

5.2.2、springBoot整合Simple缓存

  • 该缓存是springBoot默认缓存。
  • 第一步:导入坐标参考下面第一幅图
  • 第二步:启用缓存:在启动类上添加@EnableCaching注解。参考下面第二幅图
  • 第三步:使用@Cacheable将数据保存到缓存中。该注解里面还可以配置很多属性,具体使用请查阅相关文档进行学习。参考下面第三幅图
  • 第四步:从缓存中取数据,该注解既是存储时使用的,也是读取时使用的。也就是说,如果第一次通过该注解配置的方法读取数据是从数据库里面进行读取,但是第二次将会从缓存里面直接读取,避免了对数据库的操作,从而提升性能。
  • 注意事项:@Cacheable注解既有保存功能,也有读取功能。也就是说,使用该注解后,在你第一次访问一组数据后,他会将该数据存入缓存,在你第二次访问该数据时,会直接从缓存中读取,不需要经过数据库。
    SpringBoot学习_第116张图片
    SpringBoot学习_第117张图片
    SpringBoot学习_第118张图片
  • springboot可以整合的缓存类型有以下这些。
    SpringBoot学习_第119张图片

5.2.3、springBoot整合Ehcache缓存

  • 第一步:导入坐标参考下面第一幅图
  • 第二步:在yaml文件里指定使用的缓存类型,同时指定该缓存所使用的xml配置文件的名称。参考下面第二幅图
  • 第三步:编写ehcache.xml配置文件参考下面第三幅图
  • 第三步:使用时仍然使用5.2.2部分里面所使用的注解,使用方式都完全相同。
    SpringBoot学习_第120张图片
    在这里插入图片描述
    SpringBoot学习_第121张图片

5.2.4、不同淘汰策略的区分

  • 这一部分是对上图的最后一条配置进行解释的。
    SpringBoot学习_第122张图片

5.2.4、缓存供应商改为Redis

在使用Redis时,一定先要打开redis服务器,否则就无法正常使用。

  • 第一步:导坐标参考下图
    SpringBoot学习_第123张图片
  • 第二步:配置参考下图
    SpringBoot学习_第124张图片

5.2.5、安装memcached

  • 安装memcached:将安装文件解压到安装目录里面即可
  • 启动memcached,需要用cmd的管理员启动方式参考下图
    SpringBoot学习_第125张图片
  • memcached的启动和关闭命令参考下图
    在这里插入图片描述

5.2.6、缓存供应商变为memcached

注意:在使用时一定先要打开,然后在进行操作。

  • memcached目前没有整合到springboot里面。所以需要部分硬编码。
  • 第一步:导坐标
    SpringBoot学习_第126张图片
  • 配置
    SpringBoot学习_第127张图片
  • 第三步:测试
    (1)编写memcached的信息配置类
    SpringBoot学习_第128张图片
    (2)将memcached加载进入bean容器里面。因为memcached目前没有整合到springboot里面,所以该客户端的bean需要开发者将其加载进入容器里面。
    SpringBoot学习_第129张图片
    (3)memcached使用get和set对缓存数据进行存储和读取。
    SpringBoot学习_第130张图片

5.2.7、缓存供应商变为jetcache

  • 该技术是由阿里开发的。
5.2.7.1、远程缓存
  • 基本介绍
    SpringBoot学习_第131张图片
  • 第一步:使用redis的第一步(远程缓存),导入坐标。注意:使用redis一定要提前先打开redis服务器。
		<dependency>
            <groupId>com.alicp.jetcache</groupId>
            <artifactId>jetcache-starter-redis</artifactId>
            <version>2.6.2</version>
        </dependency>
  • 第二步:配置相关属性
    SpringBoot学习_第132张图片
  • 第三步:使用注解开启缓存
    SpringBoot学习_第133张图片
  • 第四步:通过@CreateCache注解进行缓存
    SpringBoot学习_第134张图片
5.2.7.2、本地缓存,
  • 第一步:导坐标,和上面一样
  • 第二步:配置属性(只看下图的local)部分即可。
  • 第三步:使用(和上述一样)
    SpringBoot学习_第135张图片
    SpringBoot学习_第136张图片

5.2.8、启用方法注解步骤,

  • 第一步:在启动类上添加@EnableMethodCache注解
    SpringBoot学习_第137张图片
  • 第二步:使用各种注解操作
    SpringBoot学习_第138张图片
  • 缓存对象必须可序列化,也就是实现Serializable接口,同时添加以下属性配置。
    SpringBoot学习_第139张图片
  • 查看缓存统计报告
    SpringBoot学习_第140张图片
    119学完

六、原理篇

6.1、自动配置

6.1.1、bean加载方式

  • 第一种:这就是常见的xml文件配置,既可以用来配置我们自己定义的类,也可以声明第三方开发的。但是值得注意的是,如果类里面没有无参构造方法,则需要进行参数配置。这种bean的配置具体属性使用请参考我的ssm学习。
    SpringBoot学习_第141张图片
  • 第二种:这一种是注解+xml文件的格式。在自己编写的的类上通过配置@Component注解将其添加到容器里面,也可以通过该注解的衍生注解,例如:@Server、@Controller等等之类,(具体还有哪些,请参考ssm)
    SpringBoot学习_第142张图片
  • 对于第三方类,可以通过@Configuration注解来编写配置类,在该配置类里面通过给方法添加@Bean注解,从来实现将第三方类配置到容器里面。下图在类上添加了一个@Compoent注解,并未使用@Configration注解,效果都一样,但是建议使用@Configuration
    SpringBoot学习_第143张图片
  • 第三种:这种配置就完全的摆脱了xml配置文件,使用全注解的方法。对于自己编写的类,首先,在需要添加到容器里的类上配置上相应的注解,比如@Server。对于第三方开发的类首先将其编写到@Configuration注解的配置类里面。然后再在配置类上使用@ComponentScan注解,扫描自己编写的类。最后再使用AnnotationConfigApplicationContext(BeanConfig.class)这种方式,就可以获取容器里面所添加的bean。这种方式可以不写@Configrution注解
    SpringBoot学习_第144张图片
  • 扩展1:可以通过以下的方式,通过继承FactoryBean从而实现在将一个bean添加到容器里面之前作进一步的初始化。并且添加进去的类并不是继承FactoryBean的类对象,而是该类里面初始化的对象。具体理解请参考下图
    SpringBoot学习_第145张图片
  • 扩展2:在配置类里面通过在@Configuration注解里面配置proxyBeanMethod=true属性值,从而可以调用该方法得到的对象是容器里面获取的,而不是重新创建的。这也就是代理的一种方式。具体参考下图,多次调用book()方法得到的对象都是同一个,都是从容器里面获取的。
    SpringBoot学习_第146张图片
  • 第四种:在配置类上直接使用@Import注解,将需要添加到容器里面的bean的字节码直接写道该注解里面,然后使用AnnotationConfigApplicationContext(BeanConfig.class)这种方式,就可以获取容器里面所添加的bean。使用该注解,无论是对第三方类,还是自己编写的类直接将其字节码导入即可,非常方便。降低了代码的耦合性。
    SpringBoot学习_第147张图片
  • 扩展3:如果配置类有多个,可以写一个总配置类,将所有的配置类字节码导入到该总配置类的@Import里面,最后加载该总配置类即可。
    SpringBoot学习_第148张图片
  • 第五种:使用上下文对象,在容器初始化完成后注入bean。使用regist方法,具体请参考下图。无论是第三方还是自己编写的类都可以通过这种方式进行注入。
    SpringBoot学习_第149张图片
  • 第六种:导入实现了ImportSelector接口的类,通过使用该方式可以进行条件选择都添加那些类到容器里面。具体请参考下图。
    SpringBoot学习_第150张图片
  • 第七种:具体的作用请看下图的文字说明。这种方式在平时使用的情况很少,但是在框架开发中会经常使用,例如springboot底层源码开发中就会用到。
    SpringBoot学习_第151张图片
  • 第八种:
    SpringBoot学习_第152张图片
    SpringBoot学习_第153张图片

6.1.2、bean加载配置

SpringBoot学习_第154张图片
SpringBoot学习_第155张图片
SpringBoot学习_第156张图片
SpringBoot学习_第157张图片
SpringBoot学习_第158张图片
SpringBoot学习_第159张图片

6.1.3、依赖属性配置

  • 在我们使用springBoot的时候,很多类的属性都是通过yaml文件来进行配置。并且很多类在不配置的情况下都会有默认值。这些是怎么做到的呢?接下来我你就模拟实现一下。
  • 先描述一下我们要实现的东西:我们要做一个猫和狗的故事,猫和狗的名字,年龄通过yaml文件配置得到,如果不配置,则使用默认值。
  • 第一步:创建Cat和Dog类(Cat类的照片就不贴上来了,和Dog的一样)
    SpringBoot学习_第160张图片
  • 第二步:编写一个读取猫和狗属性值的类CartoonProperties。使用@ConfigurationProperties注解时,该类必须使用注解被加载进容器才可以,但是这里并没有使用注解将其加载进容器,这是为什么?我们先想一下,如果给加上@Conpoent将其配到容器里面,这就意味着,以后不管我们用不用到这个类,他都会被加载进去,这显然就不太合理,容器里面的类应该是我们需要用的。然后我们再想想这个类什么时候被使用。很容易就能想到,该类主要就是加载cat和dog的属性,所以只有当我们用到故事类的时候才应该加载这个类到容器里面,那应该怎么做呢?很简单,只需要在故事类上加上@EnableConfigurationProperties注解就行,具体如何使用请参考故事类照片。
    SpringBoot学习_第161张图片
  • 第三步:编写yaml文件
    SpringBoot学习_第162张图片
  • 第四步:编写猫和狗的故事类。我们通过该类来运行该故事,但是运行该类时需要加载cat和dog的属性。所以需要将CatProperties类加载进来,我们是通过构造方法加载进来的(本来是想要通过@Autowrited注解,但是报错)。通过将该类加载进来从而实现读取属性配置文件的值。而只有运行该类的时候才需要加载CatProperties类,所以通过使用@EnableConfigurationProperties注解实现在加载该类的时候再加载CatProperties类。
  • 最后在该类里面将读取到的属性值配置进来,并且配置上默认值。
    SpringBoot学习_第163张图片

6.1.4、自动配置原理

SpringBoot学习_第164张图片

6.1.4.1、自定义starter
  • 在使用spring-boot的时候,我们导入了很多关于starter的坐标。但是如何编写这样的一个包呢?接下来就开始做一个简单的。
  • 首先,我们先建立一个springboot项目,把test和启动类删了。然后开始编写自己的功能代码。下面我们写了一个统计ip次数的功能代码,具体请看下图。
    SpringBoot学习_第165张图片
  • 将功能代码写好后,想想我们之前使用别人开发的坐标。很多都是直接将坐标导进去就可以使用了。坐标里面很多类都是自己自动注册到容器里的。接下来,我们也将这个功能写出自己启动的模式。其实也很简单,就是写一个自动配置类,通过这个自动配置类,将其添加到容器里面。参考下图
    SpringBoot学习_第166张图片
  • 写好自动配置类之后,我们还需要启动这个自动配置类。怎么做呢?很简单,只要在resource目录下创建一个META-INF文件,并在该文件里面创建一个spring.factories文件。在该文件里面写上下面的内容,就可以以后在导入坐标后自动启动。
    SpringBoot学习_第167张图片
  • 在将上面的内容做完后,需要将我们写好的东西安装到仓库里面。一定记着,在安装的时候一定要先clean然后再install。安装完成后,就可以在其他项目里面导入该坐标,然后就可以使用了。到这里我们starter的开发就完成了。但是,还有很多不完善的地方,比如yaml文件的配置等等。接下来,我们就开始完善这个starter。
6.1.4.2、完善功能一——开启定时功能
  • 因为我们写的是一个类似于打印时时更新日志信息的功能,所以需要定时输出更新的日志信息。于是就需要添加定时功能。
  • 首先,我们先在自动配置类上加上@EnableScheduling注解。然后在需要定时启动的方法上加上@Scheduled(cron=“0/5 * * * * ?”)注解,然后在注解里面写上定时时间具体配置请参考下图。但是这种写法把时间写死了,应该是通过配置文件来进行更新,具体改进后面再说。

SpringBoot学习_第168张图片
SpringBoot学习_第169张图片

6.4.3、完善功能二——添加yaml属性配置
  • 在使用springboot的时候,我们常常需要通过yaml文件对属性进行配置。那如何规定这种属性呢?
  • 首先,我们先写一个属性类,将要配置的属性写进去。并且加上@ConfigurationProperties(prefix=“tools”)注解。切记,再加上该注解之后,必须要将该类加载成bean,不然会报错。我们先想一下,什么时候加载该类比较合适呢?通过上述分析,该类加载的属性值主要是用于IpService类,所以应该是在加载IpService类的时候加载该属性配置类。所以只需要在IpService类上加上@EnableConfigurationProperties(IpProperties.class),就可以实现在加载IpService类时将IpConfiguration类加载进来。具体使用请看下面图片
    SpringBoot学习_第170张图片
    SpringBoot学习_第171张图片
6.4.1.4、功能完善三——使用属性修改自动配置加载的设置值。
  • 上面我们已经讲解如何实现yaml文件配置,接下来应该将配置的属性读取进来,并让其生效。
  • 现在回顾一下,我们之前将定时时间是写死的,现在我们先读取定时时常。我们先来看看定时时间是写在注解里面的,那如何将yaml属性里面的值在注解里面进行读取?很简单,通过使用#{类名称.属性}就可以了。但是这里有一个问题,不同注解添加到bean里面的类名称不太一样,所以如何知道bean的类名称,这该如何做到。
    SpringBoot学习_第172张图片
  • 然后除了上面那一种比较特殊外,其他的都很常见,就是通过将容器里面的IpProperties类注入,然后再获取该类的属性值就行。具体参考下图
    SpringBoot学习_第173张图片
    SpringBoot学习_第174张图片
  • 上面我们说了,在获取属性值的时候需要通过类名称,但是我们不知道类名称。所以可以在通过设置bean名称,从而就知道类名称了。但是我们在上面说过,在使用@ConfigurationProperties(prefix=“tools”)注解的时候,一定要将使用该注解的类注册到容器里面。上面我们是通过@EnableConfigurationProperties(IpProperties.class)注解完成的。但是现在我们需要设置类名称,因此需要使用另外一个注解@Component来将该类设置成bean,但是该注解并不能将其注册到容器里面。我们在使用@Component之后就需要将@EnableConfigurationProperties(IpProperties.class)注解删除掉,但是删除掉了之后就不能完成将该类注册到容器里面了。所以我们需要通过自动装载类将其注册进去,可以通过@Import,也可以通过@Bean注解。
    SpringBoot学习_第175张图片
    SpringBoot学习_第176张图片
6.4.1.5、功能完善四——自定义拦截器
  • 这一部分还需学习
    SpringBoot学习_第177张图片
6.4.1.5、功能完善五——yaml自动提示
  • 在使用springboot的写yaml配置文件的时候,我们会发现,在配置别人的属性时,都会都自动提示。那么我们如何给我们自己写的starter实现自动提示功能呢?
  • 很简单,首先现在我们写的starter里面的pom里面导入下面坐标。然后再将该项目同时使用clean和install,之后就会在我们的starter项目的target里面的classes里面找到META-INF里面的spring-configuration-metadata.json文件,将他复制到resource\META-INF里面。如果还需要自定义提示功能开发,可以**参考下图。**在完成后,需要将自动生成的spring-configuration-metadata.json文件删除,将复制的那个留下。然后再将下面的这个坐标删除就行。
    SpringBoot学习_第178张图片
    SpringBoot学习_第179张图片
  • 至此,完善功能到此结束。但是自己掌握的还远远不够,各种技术还有很多需要去学习。

6.2、

你可能感兴趣的:(springboot,spring,boot,学习,java)