Spring Boot 是由 Pivotal 团队提供的全新框架, 它的诞生,不是为了取代 Spring,而是为了让所有人,更好的使用 Spring。
目前,Spring Boot 已成为主流的 Java 框架之一,2016 年之后,越来越多的程序员选择了它。Java 程序员,已经到了必须掌握 Spring Boot 的时候。
狂神说的博客园:https://www.cnblogs.com/hellokuangshen/default.html?page=4
微信短网址:https://dwz.cn/P1N121RT
回顾
JavaSE:OOP
MySQL:持久化
HTML+CSS+JS+jQuery+框架:视图
javaWeb:独立开发 MVC 三层架构,原始方法
SSM:框架,简化了我们的开发流程,配置也开始较为复杂
Spring 再简化:SpringBoot,微服务架构!
服务越来越多:SpringCloud
Spring Boot 入门
Spring Boot 简介
简化 Spring 应用开发的一个框架;
整个 Spring 技术栈的一个大整合;
J2EE 开发的一站式解决方案。
微服务
2014,martin fowler
微服务:架构风格(服务微化)
一个应用应该是一组小型服务,可以通过 HTTP 的方式进行互通
单体应用:ALL IN ONE
微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元
第一个 SpringBoot 程序
环境:jdk1.8
、maven 3.5.4
、springboot 2.3.3.RELEASE
、IDEA开发
构建方法:
官方生成
官方提供了一个快速生成的网址:https://start.spring.io/,在官网生成下载后,解压导入IDEA开发即可。
2、填写项目信息
3、点击”Generate Project“按钮生成项目;下载此项目
4、解压项目包,并用 IDEA 以 Maven 项目导入,一路下一步即可,直到项目导入完毕。
5、如果是第一次使用,可能速度会比较慢,包比较多、需要耐心等待一切就绪。
maven 创建
① 创建一个 maven 工程
② 导入 Spring Boot 相关的依赖
1 | <parent> |
③ 编写主程序
1 | /** |
④ 编写相关的 Controller、Service 等代码
1 |
|
⑤ 运行测试
IDEA 创建
一般开发直接在 IDEA 中创建,IDEA 支持使用 Spring 的项目创建向导快速创建一个 Spring Boot 项目,选择我们需要的模块,向导会联网创建 Spring Boot 项目。
默认生成的 Spring Boot 项目:
主程序已经生成好了,我们只需要我们自己的逻辑
- 主程序已经生成好了,我们只需要我们自己的逻辑
- resources 文件夹中目录结构
- static:保存所有的静态资源; js css images;
- templates:保存所有的模板页面(Spring Boot 默认 jar 包使用嵌入式的 Tomcat,默认不支持 JSP 页面);可以使用模板引擎(freemarker、thymeleaf 等);
- application.properties:Spring Boot 应用的配置文件,可以修改一些默认设置。
Spring Boot 程序探究
POM 文件
父项目
1 | <!--有一个父项目--> |
Spring Boot 的版本仲裁中心;
以后我们导入依赖默认是不需要写版本(没有在dependencies里面管理的依赖自然需要声明版本号
)
启动器
1 | <dependency> |
spring-boot-starter-web:
spring-boot-starter:spring-boot 场景启动器,帮我们导入了 web 模块正常运行所依赖的组件;
Spring Boot 将所有的功能场景都抽取出来,做成一个个的 starter(启动器),只需要在项目里面引入这些 starter 相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器 starter
。
运行的大 Logo
到此处去生成:https://www.bootschool.net/ascii-art
在 resources 目录下新建 banner.txt,然后将生成的图案放进去即可
主程序类,主入口类
1 | // @SpringBootApplication:标准这个类是一个springboot应用 |
注解:
@SpringBootApplication:
Spring Boot 应用标注在某个类上说明这个类是 SpringBoot 的主配置类,SpringBoot 就应该运行这个类的 main 方法来启动 SpringBoot 应用;
1 | (ElementType.TYPE) |
@SpringBootConfiguration:
Spring Boot 的配置类,标注在某个类上,表示这是一个 Spring Boot 的配置类
@Configuration:
配置类上来标注这个注解,表明是 Spring 配置类@Component:
配置类上有这个注解,表明配置类也是容器中的一个组件
@EnableAutoConfiguration:
开启自动配置功能
以前我们需要配置的东西,Spring Boot 帮我们自动配置,@EnableAutoConfiguration
告诉 SpringBoot 开启自动配置功能,这样自动配置才能生效
1 | (ElementType.TYPE) |
@AutoConfigurationPackage:
自动配置包@Import(AutoConfigurationPackages.Registrar.class):
自动配置”包注册”,Spring 的底层注解@Import,给容器中导入一个组件,导入的组件由 AutoConfigurationPackages.Registrar.class将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
@Import(AutoConfigurationImportSelector.class):
EnableAutoConfigurationImportSelector.class :
导入哪些组件的选择器- 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中
- 会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
1 | //获取所有的配置,可以打断点调试 |
有了自动配置类,免去了我们手动编写配置注入功能组件等的工作
1 | List<String> configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader) |
Spring Boot在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
以前我们需要自己配置的东西,自动配置类都帮我们做了
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.3.3.RELEASE.jar中
结论
springboot 所有的自动配置都在启动类中被扫描并加载, META-INF/spring.factories
所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的 starter,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!
- SpringBoot 在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值;
- 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
- 整个 J2EE 的整体解决方案和自动配置都在 springboot-autoconfigure 的 jar 包中;
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
- 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作。
SpringApplication
不简单的方法
我最初以为就是运行了一个 main 方法,没想到却开启了一个服务
1 |
|
SpringApplication.run 分析
分析该方法主要分两部分,一部分是 SpringApplication 的实例化,二是 run 方法的执行;
SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是 Web 项目
2、查找并加载所有可用初始化器 , 设置到 initializers 属性中
3、找出所有的应用程序监听器,设置到 listeners 属性中
4、推断并设置 main 方法的定义类,找到运行的主类
查看构造器:
1 | public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) { |
run 方法流程分析
跟着源码和这幅图就可以一探究竟了!
Spring Boot 配置
配置文件
SpringBoot 使用一个全局的配置文件,配置文件名是固定的
application.properties
- 语法结构 :key=value
application.yml
- 语法结构 :key:空格 value
配置文件的作用 :修改 SpringBoot 自动配置的默认值,因为 SpringBoot 在底层都给我们自动配置好了
比如我们可以在配置文件中修改 Tomcat 默认启动的端口号!测试一下!
1 | 8081 = |
yaml 概述
YAML 是 “YAML Ain’t a Markup Language” (YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用 xml 来配置;比如一个简单的端口配置,我们来对比下 yaml 和 xml
传统 xml 配置:
1 | <server> |
yaml 配置:
1 | server: |
yaml 基础语法
说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
1 | k: v |
注意:
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: “zhang \n san” 输出 :zhang 换行 san
‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘zhang \n san’ 输出 :zhang \n san
对象、Map(键值对)
1 | #对象、Map格式 |
在下一行来写对象的属性和值得关系,注意缩进;比如:
1 | student: |
行内写法
1 | student: { name: jingge, age: 3 } |
数组( List、set )
用 -
值表示数组中的一个元素,比如:
1 | pets: |
行内写法
1 | pets: [cat, dog, pig] |
修改 SpringBoot 的默认端口号
配置文件中添加,端口号的参数,就可以切换端口
1 | server: |
配置文件值注入
yaml 文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
yaml 注入配置文件
1、在 springboot 项目中的 resources 目录下新建一个文件 application.yml
2、编写一个实体类 Dog
1 |
|
3、思考,我们原来是如何给 bean 注入属性值的!@Value,给 Dog 类测试一下
1 | //注册bean |
4、在 SpringBoot 的测试类下注入狗狗输出一下
1 |
|
结果成功输出,@Value 注入成功,这是我们原来的办法对吧。
5、我们在编写一个复杂一点的实体类:Person 类
1 | //注册bean到容器中 |
6、我们来使用 yaml 配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个 yaml 配置!
1 | person: |
7、我们刚才已经把 person 这个对象的所有值都写好了,我们现在来注入到我们的类中!
1 | /* |
8、IDEA 提示,springboot 配置注解处理器没有找到,让我们看文档,我们可以查看文档,找到一个依赖!
1 | <!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 --> |
9、确认以上配置都 OK 之后,我们去测试类中测试一下
1 |
|
结果:所有值全部注入成功!
yaml 配置注入到实体类完全 OK!
加载指定的配置文件
@PropertySource :
加载指定的配置文件;
@configurationProperties:
默认从全局配置文件中获取值;
1、我们去在 resources 目录下新建一个person.properties
文件
1 | name=jingge |
2、然后在我们的代码中指定加载 person.properties 文件
1 |
|
3、再次输出测试一下:指定配置文件绑定成功!
配置文件占位符
配置文件还可以编写占位符生成随机数
1 | person: |
@PropertySource&@ImportResource&@Bean
@PropertySource:加载指定的配置文件;
1 | /** |
@ImportResource:导入 Spring 的配置文件,让配置文件里面的内容生效;
Spring Boot 里面没有 Spring 的配置文件,我们自己编写的配置文件,也不能自动识别;
想让 Spring 的配置文件生效,加载进来;@ImportResource标注在一个配置类上
1 | "classpath:beans.xml"}) (locations = { |
不来编写 Spring 的配置文件
1 |
|
SpringBoot 推荐给容器中添加组件的方式;推荐使用全注解的方式
1、配置类@Configuration——>Spring 配置文件
2、使用@Bean给容器中添加组件
1 | /** |
回顾 properties 配置
我们上面采用的 yaml 方法都是最简单的方式,开发中最常用的;也是 springboot 所推荐的!那我们来唠唠其他的实现方式,道理都是相同的;写还是那样写;配置文件除了 yml 还有我们之前常用的 properties , 我们没有讲,我们来唠唠!
【注意】
properties 配置文件在写中文的时候,会有乱码 , 我们需要去 IDEA 中设置编码格式为 UTF-8;
settings–>FileEncodings 中配置
测试步骤:
1、新建一个实体类 User
1 | //注册bean |
2、编辑配置文件 user.properties
1 | jingge = |
3、我们在 User 类上使用@Value 来进行注入!
1 | //注册bean |
4、Springboot 测试
1 |
|
结果正常输出。
对比小结
@Value 这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦,我们来看个功能对比
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303 数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
1、@ConfigurationProperties 只需要写一次即可 , @Value 则需要每个字段都添加
2、松散绑定:
这个什么意思呢? 比如我的 yml 中写的 last-name,这个和 lastName 是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303 数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml 中可以封装对象 , 使用 value 就不支持
结论:
配置 yml 和配置 properties 都可以获取到值 , 强烈推荐 yml
;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个 JavaBean 来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
JSR303 数据校验
先看看如何使用
Springboot 中可以用@validated 来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的 name 只能支持 Email 格式
1 | //注册bean |
运行结果 :default message [不是一个合法的电子邮件地址]
使用数据校验,可以保证数据的正确性;
常见参数
1 | "名字不能为空") (message= |
多环境切换
profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境
多配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
, 用来指定多个环境版本
例如:
application-test.properties 代表测试环境配置
application-dev.properties 代表开发环境配置
但是 Springboot 并不会直接启动这些配置文件,它默认使用application.properties主配置文件
;
我们需要通过一个配置来选择需要激活的环境:
1 | #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; |
yaml 的多文档块
和 properties 配置文件中一样,但是使用 yml 去实现不需要创建多个配置文件,更加方便了 !
1 | server: |
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
配置文件加载位置
外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!
springboot 启动会扫描以下位置的 application.properties 或者 application.yml 文件作为 Spring boot 的默认配置文件
1 | file:./config/ |
1 | 优先级1:项目路径下的config文件夹配置文件 |
优先级由高到底,高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置全部加载主配置文件,互补配置
拓展,运维小技巧
指定位置加载配置文件
我们还可以通过 spring.config.location 来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置
这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
1 | java -jar spring-boot-config.jar --spring.config.location=F:/application.properties |
自动配置原理
配置文件到底能写什么?怎么写?
SpringBoot 官方文档中有大量的配置,我们无法全部记住
分析自动配置原理
我们以 HttpEncodingAutoConfiguration(Http编码自动配置)
为例解释自动配置原理
1 | //表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件; |
一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效!
- 一但这个配置类生效;这个配置类就会给容器中添加各种组件;
- 这些组件的属性是从对应的 properties 类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
- 所有在配置文件中能配置的属性都是在 xxxxProperties 类中封装着;
- 配置文件能配置什么就可以参照某个功能对应的这个属性类。
1 | //从配置文件中获取指定的值和bean的属性进行绑定 |
我们去配置文件里面试试前缀,看提示!
这就是自动装配的原理!
精髓
1、SpringBoot 启动会加载大量的自动配置类;
2、我们看我们需要的功能有没有在 SpringBoot 默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从 properties 类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可。
xxxxAutoConfigurartion:自动配置类,给容器中添加组件
xxxxProperties:封装配置文件中相关属性
了解 @Conditional
了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效
@Conditional 派生注解(Spring 注解版原生的@Conditional 作用)
作用:必须是@Conditional 指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效
@Conditional 扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的 java 版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定 Bean; |
@ConditionalOnMissingBean | 容器中不存在指定 Bean; |
@ConditionalOnExpression | 满足 SpEL 表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的 Bean,或者这个 Bean 是首选 Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是 web 环境 |
@ConditionalOnNotWebApplication | 当前不是 web 环境 |
@ConditionalOnJndi | JNDI 存在指定项 |
那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效
1 | #开启springboot的调试类 |
Positive matches:(自动配置类启用的:正匹配)
Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
Unconditional classes: (没有条件的类)
【演示:查看输出的日志】
1 | ========================= |
自定义 Starter
我们分析完毕了源码以及自动装配的过程,我们可以尝试自定义一个启动器来玩玩!
说明
启动器模块是一个 空 jar 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库
命名归约:
官方命名:
- 前缀:spring-boot-starter-xxx
- 比如:spring-boot-starter-web….
自定义命名:
- xxx-spring-boot-starter
- 比如:mybatis-spring-boot-starter
编写启动器
1、在 IDEA 中新建一个空项目 spring-boot-starter-diy
2、新建一个普通 Maven 模块:jing-spring-boot-starter
3、新建一个 Spring Boot 模块:jing-spring-boot-starter-autoconfigure
4、点击 apply 即可,基本结构
5、在我们的 starter 中 导入 autoconfigure 的依赖!
1 | <!-- 启动器 --> |
6、将 autoconfigure 项目下多余的文件都删掉,pom 文件中只留下一个 spring-boot-starter
,这是所有的启动器基本配置!
7、在 autoconfigure 编写 HelloProperties 配置类
1 | package com.itjing; |
8、在 autoconfigure 我们编写一个自己的服务
1 | package com.itjing; |
9、在 autoconfigure 编写我们的自动配置类并注入 bean,测试!
1 | package com.itjing; |
10、在 autoconfigure 的 resources 中编写一个自己的 META-INF\spring.factories
1 | # Auto Configure |
11、编写完成后,将启动器和自动配置安装到 maven 仓库中
新建项目测试我们自己写的启动器
1、新建一个 SpringBoot 项目
2、导入我们自己写的启动器
1 | <dependency> |
3、编写一个 HelloController 进行测试我们自己的写的接口
1 | package com.itjing.controller; |
4、编写配置文件 application.properties
1 | "ppp" = |
5、启动项目进行测试,结果成功
Spring Boot 整合 JDBC
SpringData 简介
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。
Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。
Sping Data 官网:https://spring.io/projects/spring-data
数据库相关的启动器 :可以参考官方文档:
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
整合 JDBC
创建测试项目测试数据源
1、我去新建一个项目测试:springboot-data-jdbc ,引入相应的模块,基础模块
2、项目建好之后,发现自动帮我们导入了如下的启动器:
1 | <dependency> |
3、编写 yaml 配置文件连接数据库
1 | spring: |
4、配置完这一些东西后,我们就可以直接去使用了,因为 SpringBoot 已经默认帮我们进行了自动配置,去测试类测试一下
1 |
|
结果:我们可以看到他默认给我们配置的数据源为 : class com.zaxxer.hikari.HikariDataSource
, 我们并没有手动配置
我们来全局搜索一下,找到数据源的所有自动配置都在 :DataSourceAutoConfiguration
1 | false) (proxyBeanMethods = |
这里导入的类都在 DataSourceConfiguration 配置类下,可以看出 Spring Boot 2.0 以上默认使用HikariDataSource
数据源,而以前版本,如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource
作为数据源
HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀
可以使用 spring.datasource.type 指定自定义的数据源类型,值为 要使用的连接池实现的完全限定名
关于数据源我们并不做介绍,有了数据库连接,显然就可以 CRUD 操作数据库了。但是我们需要先了解一个对象 JdbcTemplate
JDBCTemplate
1、有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
2、即使不使用第三方第数据库操作框架,如 MyBatis 等,Spring 本身也对原生的 JDBC 做了轻量级的封装,即 JdbcTemplate。
3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
4、Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用
5、JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类
JdbcTemplate主要提供以下几类方法:
- execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句;
- update 方法及 batchUpdate 方法:update 方法用于执行新增、修改、删除等语句;batchUpdate 方法用于执行批处理相关语句;
- query 方法及 queryForXXX 方法:用于执行查询相关语句;
- call 方法:用于执行存储过程、函数相关语句。
测试
编写一个 Controller,注入 jdbcTemplate,编写测试方法进行访问测试
1 | package com.itjing.controller; |
测试请求,结果正常;
到此,CURD 的基本操作,使用 JDBC 就搞定了。
Spring Boot 整合 Druid
集成 Druid
Druid 简介
Java 程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。
Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。
Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。
Druid 已经在阿里巴巴部署了超过 600 个应用,经过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github 地址:https://github.com/alibaba/druid/
com.alibaba.druid.pool.DruidDataSource 基本配置参数如下:
配置数据源
1、添加上 Druid 数据源依赖
1 | <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> |
2、切换数据源,之前已经说过 Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以通过 spring.datasource.type 指定数据源
1 | spring: |
3、数据源切换之后,在测试类中注入 DataSource,然后获取到它,输出一看便知是否成功切换
4、切换成功!既然切换成功,就可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等设置项;可以查看源码
1 | spring: |
5、导入 Log4j 的依赖
1 | <!--log4j --> |
6、现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性
1 | package com.itjing.config; |
7、去测试类中测试一下;看是否成功!
1 |
|
输出结果 :可见配置参数已经生效!
配置 Druid 数据源监控
Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装路由器时,人家也提供了一个默认的 web 页面。
所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等,配置后台管理。
到 DruidConfig 中配置:
1 | //配置 Druid 监控管理后台的Servlet; |
配置完毕后,我们可以选择访问 :http://localhost:8080/druid/login.html
进入之后
配置 Druid web 监控 filter 过滤器
1 | //配置 Druid 监控 之 web 监控的 filter |
平时在工作中,按需求进行配置即可,主要用作监控!
Spring Boot 整合 MyBatis
整合 MyBatis
官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
Maven 仓库地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.1
整合测试
1、导入 MyBatis 所需要的依赖
1 | <!--mybatis--> |
2、配置数据库连接信息(不变)
1 | spring: |
3、测试数据库是否连接成功!
4、创建实体类,导入 Lombok!
1 | <!--lombok--> |
Department.java
1 | package com.itjing.entity; |
5、创建 mapper 目录以及对应的 Mapper 接口
DepartmentMapper.java
1 | package com.itjing.mapper; |
6、对应的 Mapper 映射文件
DepartmentMapper.xml
1 |
|
7、maven 的 pom 文件中配置资源过滤问题,在 build 标签下
1 | <build> |
8、编写部门的 DepartmentController 进行测试!
1 | package com.itjing.controller; |
启动项目访问进行测试!
我们增加一个员工类再测试下,为之后做准备
1、新建一个 Employee 类
1 | package com.itjing.entity; |
2、新建一个 EmployeeMapper 接口
1 | package com.itjing.mapper; |
3、编写 EmployeeMapper.xml 映射文件
1 |
|
4、编写 EmployeeController 类进行测试
1 | package com.itjing.controller; |
测试结果完成,搞定收工!
Web 开发静态资源处理
Web 开发探究
简介
其实 SpringBoot 的东西用起来非常简单,因为 SpringBoot 最大的特点就是自动装配。
使用 SpringBoot 的步骤
1、创建一个 SpringBoot 应用,选择我们需要的模块,SpringBoot 就会默认将我们的需要的模块自动配置好
2、手动在配置文件中配置部分配置项目就可以运行起来了
3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。
要熟悉掌握开发,之前学习的自动配置的原理一定要搞明白!
比如 SpringBoot 到底帮我们配置了什么?我们能不能修改?我们能修改哪些配置?我们能不能扩展?
- 向容器中自动配置组件 :*** Autoconfiguration
- 自动配置类,封装配置文件的内容:***Properties
没事就找找类,看看自动装配原理!
我们之后来进行一个单体项目的小项目测试,让大家能够快速上手开发!
静态资源处理
静态资源映射规则
首先,我们搭建一个普通的 SpringBoot 项目,回顾一下 HelloWorld 程序!
写请求非常简单,那我们要引入我们前端资源,我们项目中有许多的静态资源,比如 css,js 等文件,这个 SpringBoot 怎么处理呢?
如果我们是一个 web 应用,我们的 main 下会有一个 webapp,我们以前都是将所有的页面导在这里面的,对吧!但是我们现在的 pom 呢,打包方式是为 jar 的方式,那么这种方式 SpringBoot 能不能来给我们写页面呢?当然是可以的,但是 SpringBoot 对于静态资源放置的位置,是有规定的!
我们先来聊聊这个静态资源映射规则:
SpringBoot 中,SpringMVC 的 web 配置都在 WebMvcAutoConfiguration 这个配置类里面;
我们可以去看看 WebMvcAutoConfigurationAdapter 中有很多配置方法;
有一个方法:addResourceHandlers 添加资源处理
1 |
|
读一下源代码:比如所有的 /webjars/** , 都需要去 classpath:/META-INF/resources/webjars/ 找对应的资源。
什么是 webjars 呢?
Webjars 本质就是以 jar 包的方式引入我们的静态资源 , 我们以前要导入一个静态资源文件,直接导入即可。
使用 SpringBoot 需要使用 Webjars,我们可以去搜索一下:https://www.webjars.org
要使用 jQuery,我们只要要引入 jQuery 对应版本的 pom 依赖即可!
1 | <dependency> |
导入完毕,查看 webjars 目录结构,并访问 Jquery.js 文件!
访问:只要是静态资源,SpringBoot 就会去对应的路径寻找资源
我们这里访问:http://localhost:8080/webjars/jquery/3.4.1/jquery.js
第二种静态资源映射规则
那我们项目中要是使用自己的静态资源该怎么导入呢?我们看一下代码。
我们去找 staticPathPattern 发现第二种映射规则 :/** , 访问当前的项目任意资源,它会去找 resourceProperties 这个类,我们可以点进去看一下分析:
1 | // 进入方法 |
ResourceProperties 可以设置和我们静态资源有关的参数;这里面指向了它会去寻找资源的文件夹,即上面数组的内容。
所以得出结论,以下四个目录存放的静态资源可以被我们识别:
1 | "classpath:/META-INF/resources/" |
我们可以在 resources 根目录下新建对应的文件夹,都可以存放我们的静态文件;
比如我们访问 http://localhost:8080/1.js , 他就会去这些文件夹中寻找对应的静态资源文件。
自定义静态资源路径
我们也可以自己通过配置文件来指定一下,哪些文件夹是需要我们放静态资源文件的,在 application.properties 中配置
1 | classpath:/coding/,classpath:/jing/ = |
一旦自己定义了静态文件夹的路径,原来的自动配置就都会失效了!
首页处理
静态资源文件夹说完后,我们继续向下看源码!可以看到一个欢迎页的映射,就是我们的首页!
1 |
|
点进去继续看
1 | private Optional<Resource> getWelcomePage() { |
欢迎页,静态资源文件夹下的所有 index.html 页面;被 /** 映射。
比如我访问 http://localhost:8080/ ,就会找静态资源文件夹下的 index.html
新建一个 index.html ,在我们上面的 3 个目录中任意一个;然后访问测试 http://localhost:8080/ 看结果!
关于网站图标说明:
与其他静态资源一样,Spring Boot 在配置的静态内容位置中查找 favicon.ico。
如果存在这样的文件,它将自动用作应用程序的 favicon。
1、关闭 SpringBoot 默认图标
1 | #关闭默认图标 |
2、自己放一个图标在静态资源目录下,我放在 public 目录下
3、清除浏览器缓存!刷新网页,发现图标已经变成自己的了!
Thymeleaf 模板引擎
Thymeleaf
模板引擎
前端交给我们的页面,是 html 页面。如果是我们以前开发,我们需要把他们转成 jsp 页面,jsp 好处就是当我们查出一些数据转发到 JSP 页面以后,我们可以用 jsp 轻松实现数据的显示,及交互等。
jsp 支持非常强大的功能,包括能写 Java 代码,但是呢,我们现在的这种情况,SpringBoot 这个项目首先是以 jar 的方式,不是 war,第二,我们用的还是嵌入式的 Tomcat,所以呢,他现在默认是不支持jsp的
。
那不支持 jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?
SpringBoot推荐你可以来使用模板引擎:
模板引擎,我们其实大家听到很多,其实 jsp 就是一个模板引擎,还有用的比较多的 freemarker,包括 SpringBoot 给我们推荐的 Thymeleaf,模板引擎有非常多,但再多的模板引擎,他们的思想都是一样的,什么样一个思想呢我们来看一下这张图:
模板引擎的作用就是我们来写一个页面模板,比如有些值呢,是动态的,我们写一些表达式。而这些值,从哪来呢,就是我们在后台封装一些数据。然后把这个模板和这个数据交给我们模板引擎,模板引擎按照我们这个数据帮你把这表达式解析、填充到我们指定的位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这就是我们这个模板引擎,不管是 jsp 还是其他模板引擎,都是这个思想。只不过呢,就是说不同模板引擎之间,他们可能这个语法有点不一样。其他的我就不介绍了,我主要来介绍一下 SpringBoot 给我们推荐的 Thymeleaf 模板引擎,这模板引擎呢,是一个高级语言的模板引擎,他的这个语法更简单。而且呢,功能更强大。
我们呢,就来看一下这个模板引擎,那既然要看这个模板引擎。首先,我们来看 SpringBoot 里边怎么用。
引入 Thymeleaf
怎么引入呢,对于 springboot 来说,什么事情不都是一个 starter 的事情嘛,我们去在项目中引入一下。
给大家三个网址:
Thymeleaf 官网:https://www.thymeleaf.org/
Thymeleaf 在 Github 的主页:https://github.com/thymeleaf/thymeleaf
Spring 官方文档:找到我们对应的版本
https://docs.spring.io/spring-boot/docs/2.3.3.RELEASE/reference/htmlsingle/#using-boot-starter
找到对应的 pom 依赖:可以适当点进源码看下本来的包
1 | <!--thymeleaf--> |
Maven 会自动下载 jar 包,我们可以去看下下载的东西
Thymeleaf 分析
前面呢,我们已经引入了 Thymeleaf,那这个要怎么使用呢?
我们首先得按照 SpringBoot 的自动配置原理看一下我们这个 Thymeleaf 的自动配置规则,在按照那个规则,我们进行使用。
我们去找一下 Thymeleaf 的自动配置类:ThymeleafProperties
1 | ( |
我们可以在其中看到默认的前缀和后缀!
我们只需要把我们的html页面放在类路径下的templates下,thymeleaf就可以帮我们自动渲染了。
使用 thymeleaf 什么都不需要配置,只需要将他放在指定的文件夹下即可!
测试
1、编写一个 TestController
1 |
|
2、编写一个测试页面 test.html 放在 templates 目录下
1 |
|
3、启动项目请求测试
Thymeleaf 语法学习
要学习语法,还是参考官网文档最为准确,我们找到对应的版本看一下
Thymeleaf 官网:https://www.thymeleaf.org/ , 简单看一下官网!我们去下载 Thymeleaf 的官方文档!
我们做个最简单的练习 :我们需要查出一些数据,在页面中展示
1、修改测试请求,增加数据传输;
1 | "/t1") ( |
2、我们要使用 thymeleaf,需要在 html 文件中导入命名空间的约束,方便提示。
我们可以去官方文档中看一下命名空间拿过来:
1 | xmlns:th="http://www.thymeleaf.org" |
3、我们去编写下前端页面
1 |
|
4、启动测试!
具体的语法参考我的那篇Thymeleaf文章!
MVC 自动配置原理
官网阅读
在进行项目编写前,我们还需要知道一个东西,就是 SpringBoot 对我们的 SpringMVC 还做了哪些配置,包括如何扩展,如何定制。
只有把这些都搞清楚了,我们在之后使用才会更加得心应手。
途径一:源码分析!
途径二:官方文档!
1 | Spring MVC Auto-configuration |
我们来仔细对照,看一下它怎么实现的,它告诉我们 SpringBoot 已经帮我们自动配置好了 SpringMVC,然后自动配置了哪些东西呢?
ContentNegotiatingViewResolver 内容协商视图解析器
自动配置了 ViewResolver,就是我们之前学习的 SpringMVC 的视图解析器;
即根据方法的返回值取得视图对象(View),然后由视图对象决定如何渲染(转发,重定向)。
我们去看看这里的源码:我们找到 WebMvcAutoConfiguration , 然后搜索 ContentNegotiatingViewResolver。
找到如下方法!
1 |
|
我们可以点进这类看看!找到对应的解析视图的代码
1 | // 注解说明:@Nullable 即参数可为null |
我们继续点进去看,他是怎么获得候选的视图的呢?
getCandidateViews 中看到他是把所有的视图解析器拿来,进行 while 循环,挨个解析!
1 | Iterator var5 = this.viewResolvers.iterator(); |
所以得出结论:ContentNegotiatingViewResolver 这个视图解析器就是用来组合所有的视图解析器的
我们再去研究下他的组合逻辑,看到有个属性 viewResolvers,看看它是在哪里进行赋值的!
1 | protected void initServletContext(ServletContext servletContext) { |
既然它是在容器中去找视图解析器,我们是否可以猜想,我们就可以去实现一个视图解析器了呢?
我们可以自己给容器中去添加一个视图解析器;这个类就会帮我们自动的将它组合进来
我们去实现一下
1、我们在我们的主程序中去写一个视图解析器来试试
1 | //放到bean中 |
2、怎么看我们自己写的视图解析器有没有起作用呢?
我们给 DispatcherServlet 中的 doDispatch 方法 加个断点进行调试一下,因为所有的请求都会走到这个方法中
3、我们启动我们的项目,然后随便访问一个页面,看一下 Debug 信息
找到 this
找到视图解析器,我们看到我们自己定义的就在这里了
所以说,我们如果想要使用自己定制化的东西,我们只需要给容器中添加这个组件就好了!
剩下的事情 SpringBoot 就会帮我们做了!
转换器和格式化器
找到格式化转换器:
1 |
|
点进去
1 | public String getDateFormat() { |
可以看到在我们的 Properties 文件中,我们可以进行自动配置它!
如果配置了自己的格式化方式,就会注册到 Bean 中生效,我们可以在配置文件中配置日期格式化的规则:
修改 SpringBoot 的默认配置
这么多的自动配置,原理都是一样的,通过这个 WebMVC 的自动配置原理分析,我们要学会一种学习方式,通过源码探究,得出结论。
这个结论一定是属于自己的,而且一通百通。
SpringBoot 的底层,大量用到了这些设计细节思想,所以,没事需要多阅读源码!得出结论。
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(如果用户自己配置@bean),如果有就用用户配置的,如果没有就用自动配置的;
如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来!
扩展使用SpringMVC
官方文档如下:
1 | If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components. |
我们要做的就是编写一个@Configuration 注解类,并且类型要为 WebMvcConfigurer,还不能标注@EnableWebMvc 注解,我们去自己写一个我们新建一个包叫 config,写一个类 MyMvcConfig
1 | //应为类型要求为WebMvcConfigurer,所以我们实现其接口 |
我们去浏览器访问一下:
确实也跳转过来了!
所以说,我们要扩展 SpringMVC,官方就推荐我们这么去使用,既保 SpringBoot 留所有的自动配置,也能用我们扩展的配置!
我们可以去分析一下原理:
1、WebMvcAutoConfiguration
是 SpringMVC 的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter
2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
3、我们点进EnableWebMvcConfiguration
这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration
这个父类中有这样一段代码:
1 | public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { |
4、我们可以在这个类中去寻找一个我们刚才设置的 viewController 当做参考,发现它调用了一个
1 | protected void addViewControllers(ViewControllerRegistry registry) { |
5、我们点进去看一下
1 |
|
所以得出结论:所有的WebMvcConfiguration都会被作用,不止Spring自己的配置类,我们自己的配置类当然也会被调用
全面接管 SpringMVC
官方文档:
1 | If you want to take complete control of Spring MVC |
全面接管即:SpringBoot 对 SpringMVC 的自动配置不需要了,所有都是我们自己去配置!
只需在我们的配置类中要加一个@EnableWebMvc
。
我们看下如果我们全面接管了 SpringMVC 了,我们之前 SpringBoot 给我们配置的静态资源映射一定会无效,我们可以去测试一下
不加注解之前,访问首页:
给配置类加上注解:@EnableWebMvc
我们发现所有的 SpringMVC 自动配置都失效了!回归到了最初的样子!
当然,我们开发中,不推荐使用全面接管SpringMVC
思考问题?为什么加了一个注解,自动配置就失效了!
我们看下源码:
1、这里发现它是导入了一个类,我们可以继续进去看
1 | .class}) ({DelegatingWebMvcConfiguration |
2、它继承了一个父类 WebMvcConfigurationSupport
1 | public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { |
3、我们来回顾一下 Webmvc 自动配置类
1 | false) (proxyBeanMethods = |
总结一句话:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来了
而导入的 WebMvcConfigurationSupport 只是 SpringMVC 最基本的功能!
在SpringBoot中会有非常多的扩展配置,只要看见了这个,我们就应该多留心注意~
页面国际化
有的时候,我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要学习国际化了!
准备工作
先在 IDEA 中统一设置 properties 的编码问题!
编写国际化配置文件,抽取页面需要显示的国际化页面消息。
我们可以去登录页面查看一下,哪些内容我们需要编写国际化的配置!
配置文件编写
1、我们在resources
资源文件下新建一个 i18n 目录,存放国际化配置文件
2、建立一个login.properties
文件,还有一个login_zh_CN.properties
,发现 IDEA 自动识别了我们要做国际化操作,文件夹变了!
3、我们可以在这上面去新建一个文件
弹出如下页面:我们再添加一个英文的
这样就快捷多了!
4、接下来,我们就来编写配置,我们可以看到idea下面
有另外一个视图
这个视图我们点击 + 号就可以直接添加属性了
我们新建一个 login.tip,可以看到边上有三个文件框可以输入
我们添加一下首页的内容!
然后依次添加其他页面内容即可!
然后去查看我们的配置文件
login.properties :
默认
1 | 登录 = |
login_en_US.properties:
英文
1 | Sign in = |
login_zh_CN.properties:
中文
1 | 登录 = |
OK,配置文件步骤搞定!
配置文件生效探究
我们去看一下 SpringBoot 对国际化的自动配置!这里又涉及到一个类:MessageSourceAutoConfiguration
里面有一个方法,发现 SpringBoot 已经自动配置好了管理我们国际化资源文件的组件 ResourceBundleMessageSource
1 | // 获取 properties 传递过来的值进行判断 |
我们真实的情况是放在了 i18n 目录下,所以我们要去配置这个 messages 的路径
1 | i18n.login = |
配置页面国际化值
去页面获取国际化的值,查看 Thymeleaf 的文档,找到 message 取值操作为:#{...}
。
我们去页面测试
我们可以去启动项目,访问一下,发现已经自动识别为中文的了!
但是我们想要更好!可以根据按钮自动切换中文英文!
配置国际化解析
在 Spring 中有一个国际化的Locale (区域信息对象)
;里面有一个叫做LocaleResolver (获取区域信息对象)
的解析器!
我们去我们 webmvc 自动配置文件,寻找一下!看到 SpringBoot 默认配置:
1 |
|
AcceptHeaderLocaleResolver
这个类中有一个方法
1 | public Locale resolveLocale(HttpServletRequest request) { |
那假如我们现在想点击链接让我们的国际化资源生效,就需要让我们自己的 Locale 生效!
我们去自己写一个自己的 LocaleResolver,可以在链接上携带区域信息!
修改一下前端页面的跳转连接:
1 | <!-- 这里传入参数不需要使用 ?使用 (key=value),thymeleaf的写法 --> |
我们去写一个处理的组件类!
1 | //可以在链接上携带区域信息 |
为了让我们的区域化信息能够生效,我们需要再配置一下这个组件!在我们自己的 MvcConofig 下添加 bean
1 |
|
我们重启项目,来访问一下,发现点击按钮可以实现成功切换!搞定收工!
集成 Swagger 终极版
具体内容请看我根据狂神视频做的 swagger 笔记,专门讲解 swagger 的那篇博客文章。
异步、定时、邮件任务
前言
在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。还有一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息。还有就是邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实 SpringBoot 都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~
异步任务
1、创建一个 service 包
2、创建一个类 AsyncService
异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况
1 | package com.itjing.service; |
3、编写 controller 包
4、编写 AsyncController 类
1 | package com.itjing.controller; |
5、访问 http://localhost:8080/hello 进行测试,3秒后出现success
,这是同步等待
的情况。
问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解
即可,如下:
1 | //告诉Spring这是一个异步方法 |
SpringBoot 就会自己开一个线程池,进行调用!
但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync
,开启异步注解功能
1 |
|
7、重启测试,网页瞬间响应,后台代码依旧执行!
定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring 为我们提供了异步执行任务调度的方式,提供了两个接口。
TaskExecutor接口
TaskScheduler接口
两个注解:
@EnableScheduling
@Scheduled
cron 表达式:
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59 的整数 | , - * / 四个字符 |
分(_Minutes_) | 0~59 的整数 | , - * / 四个字符 |
小时(_Hours_) | 0~23 的整数 | , - * / 四个字符 |
日期(_DayofMonth_) | 1~31 的整数(但是你需要考虑你月的天数) | ,- * ? / L W C 八个字符 |
月份(_Month_) | 1~12 的整数或者 JAN-DEC | , - * / 四个字符 |
星期(_DayofWeek_) | 1~7 的整数或者 SUN-SAT (1=SUN) | , - * ? / L C # 八个字符 |
年(可选,留空)(_Year_) | 1970~2099 | , - * / 四个字符 |
(1)* :表示匹配该域的任意值。
假如在 Minutes 域使用 * , 即表示每分钟都会触发事件。
(2)? :只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。
因为 DayofMonth 和 DayofWeek 会相互影响。例如想在每月的 20 日触发调度,不管 20 日到底是星期几,则只能使用如下写法: 13 13 15 20 _ ?, 其中最后一位只能用?,而不能使用_,如果使用*表示不管星期几都会触发,实际上并不是这样。
(3)- :表示范围。
例如在 Minutes 域使用 5-20,表示从 5 分到 20 分钟每分钟触发一次
(4)/ :表示起始时间开始触发,然后每隔固定时间触发一次。
例如在 Minutes 域使用 5/20,则意味着 5 分钟触发一次,而 25,45 等分别触发一次.
(5), :表示列出枚举值。
例如:在 Minutes 域使用 5,20,则意味着在 5 和 20 分每分钟触发一次。
(6)L :表示最后,只能出现在DayofWeek和DayofMonth域。
如果在 DayofWeek 域使用 5L,意味着在最后的一个星期四触发。
(7)W :表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。
例如:在 DayofMonth 使用 5W,如果 5 日是星期六,则将在最近的工作日:星期五,即 4 日触发。如果 5 日是星期天,则在 6 日(周一)触发;如果 5 日在星期一到星期五中的一天,则就在 5 日触发。另外一点,W 的最近寻找不会跨过月份 。
(8)L W :这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)# :用于确定每个月第几个星期几,只能出现在DayofMonth域。
例如在 4#2,表示某月的第二个星期三。
测试步骤:
1、创建一个 ScheduledService
1 |
|
2、这里写完定时任务之后,我们需要在主程序上增加 @EnableScheduling
开启定时任务功能
1 |
|
3、我们来详细了解下 cron 表达式
http://www.bejson.com/othertools/cron/
4、常用的表达式
1 | (1)0/2 * * * * ? //表示每2秒 执行任务 |
自己测试功能!!!
邮件任务
邮件发送,在我们的日常开发中,也非常的多,Springboot 也帮我们做了支持
- 邮件发送需要引入
spring-boot-start-mail
- SpringBoot 自动配置
MailSenderAutoConfiguration
- 定义 MailProperties 内容,配置在 application.yml 中
- 自动装配 JavaMailSender
- 测试邮件发送
测试:
1、引入 pom 依赖
1 | <!--邮箱发送邮件--> |
看它引入的依赖,可以看到 jakarta.mail
2、查看自动配置类:MailSenderAutoConfiguration
这个类中存在 bean,JavaMailSenderImpl
然后我们去看下配置文件
1 | "spring.mail") (prefix = |
3、配置文件:
1 | 2427259171@qq.com = |
获取授权码:
在 QQ 邮箱中的设置->账户->开启 pop3 和 smtp 服务
4、Spring 单元测试
1 |
|
查看邮箱,邮件接收成功!
我们只需要使用 Thymeleaf 进行前后端结合即可开发自己网站邮件收发功能了!
发布时间: 2020-12-21
最后更新: 2024-06-24
本文标题: SpringBoot教程IDEA版通俗易懂
本文链接: https://blog-yilia.xiaojingge.com/posts/ad8fc52e.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
