springboot纯干货
1.spring发展
spring是开源框架,2003年兴起的java轻量级框架。作者:Rod Johnson.
spring是为了解决企业级应用开发的复杂性而创建的,简化开发
spring1.x时代,都是通过xml配置bean
spring2.x时代,可使用注解对bean进行声明和注入
spring3.x时代,开始提供了java配置方式,使用此方式可以更好地理解配置的bean
spring4.x时代和springboot都推荐使用java配置方式
2.springboot和微服务介绍
springboot简介
由Pivotal团队提供的全新框架,目的是为了简化新spring应用的初始搭建以及开发过程.
此框架使用了特定的方式来进行配置,不再需要定义样板化的配置.
官方地址:https://spring.io/projects/spring-boot
官方文档地址:https://docs.spring.io/spring-boot/docs/current/reference/html/
springboot优点
约定优于配置
创建独立的springboot应用程序;嵌入的tomcat jetty或undertow,无需部署war文件
允许通过maven来根据需要获取starter
尽可能的使用自动配置spring
提供生产就绪功能,如指标,健康检查和外部部署 properties yaml yml
完全没有代码生成,对XML没有要求配置
特性理解
为基于spring的开发提供更快的入门体验
开箱即用,没有代码生成,无需XML配置.也可修改默认值来满足特定的需求
提供一些大型项目中常见的非功能特性:嵌入式服务器,安全,指标,健康检测,外部配置等
springboot并不是对spring功能的增强,而是提供了一种快速使用spring的方式
传统开发模式:所有功能打包在一个war包中,除了容器外基本没有外部依赖,部署在一个JEE容器(tomcat,jboss,weblogic)中,包含了do/dao/service/ui等所有逻辑
优点:开发简单,集中式管理,基本不会重复开发,功能都在本地,没有分布式的管理和调用消耗
缺点:效率低(开发都在同一个本地代码,相互等待,冲突不断);
维护难(代码功能耦合在一块,新人不知从何下手);
不灵活(构建时间长,任何小改动都要重构整个项目);
稳定性差(一个微笑的问题,都可能导致整个应用挂掉);
扩展性不够(无码满足高并发下的业务需求);
对服务器的性能要求要统一,更高
微服务开发
微服务:架构风格(服务微化)
微服务是指开发一个单个小型但有业务功能的服务,每个服务有自己的处理和通信机制,可部署在单个或多个服务器上
微服务也指一种松耦合的,有一定有界上下文的面向服务的架构
目的:有效拆分应用,实现敏捷开发和部署
优点:
每个微服务都很小,可聚焦一个指定的业务或功能需求
适合2-5人小团队开发
松耦合,是有功能,有意义的服务,开发阶段和部署阶段都是独立的
可使用不同的语言开发
可部署在中低端配置的服务器上
很容易和第三方集成
每个服务都有自己的存储能力,单独的库,也可有统一的库
缺点:
可能会带来过多的操作
可能1件事需要做两遍
分布式系统可能复杂难管理
分布跟踪部署难
服务数量增加时,管理难度增加
3.springboot入门程序
查看参考资料即可.
自定义banner制作网址:https://www.bootschool.net/ascii
自定义banner在 src/main/resourcees目录下创建一个banner.txt文件,输入想显示的内容即可
4.常用注解[spring的java配置]
4.1 回顾spring和java的注释
4.1.1 类上的注解
@Controller 控制器
@RestController = @Controller + @ResponseBody 返回json的控制器
@Service 标记服务接口
@Respority 标记仓库接口
@Component 标记组件
@RequestMapping 请求映射(可用在方法上),作用在类上的常用注解
4.1.2 方法上的注解
@RequestMapping 请求映射
@GetMapping GET请求
@PostMapping POST请求
@DeleteMapping DELETE请求
@PutMapping PUT请求
@PatchMapping PATCH请求
@ResponseBody 返回JSON对象
4.1.3 参数上的注解
@RequestBody 入参是JSON对象
@PathVariable 将路径上的参数映射到入参里面
@RequestParam 将请求参数绑定在控制器的请求参数上
4.1.4 属性上的注解
@Autowired 自动注入(首选按照类型) byType byName
@Resource 自动注入(首选按照名字) byName byType
4.2 相关注解说明
4.2.1 @Configuration 作用于类上,相当于一个xml配置文件,例如application-dao.xml
4.2.2 @Bean 作用于方法上,相当于xml配置中的<bean>标签
例如:某配置类上使用注解@Configuration,方法上使用@Bean(value="user1")注解修饰
4.2.3 @Qualifier注解 此注解可以表明那个实现类才是需要的。@Qualifier的参数名称必须是之前定义@Bean注解的名称之一
4.2.4 @Primaty 主候选的。当IOC容器中有多个相同类型的对象时,出现冲突时,使用该注解修饰的对象作为主候选对象
4.2.5 @Import 创建配置文件之后可以引入其他配置文件
4.2.6 @ComponentScan("com.ss.*.mapper") 配置扫描,代替配置文件中<context:component-scan base-package="com.ss.*.mapper"/>的作用
5.springboot热部署
5.1 热部署是什么
spring提供了spring-boot-devtools的模块来使springboot应用支持热部署,提高开发效率,修改代码后无需重启应用。
5.2 添加依赖 org.springframework.boot spring-boot-devtools runtime true
5.3 配置idea的启动面板 不配置面板,可直接使用ctrl+F9刷新,配置以后,当修改代码,光标失去idea的焦点后,就会触发自动部署
6.手动创建springboot项目 查看参考资料即可
7.springboot自动配置原理以及启动分析(难点)
1.默认的包扫描:启动类所在的包及其子包
2.依赖的分析
7.1 pom.xml的依赖分析
自定义项目继承了springboot的父项目,spring-boot-starter-parent,点进spring-boot-starter-parent中可看到很多依赖的版本。
sprint-boot-dependencies是真正管理springboot应用中所有依赖版本的地方,springboot的版本控制中心;
往后导入依赖默认不需要写版本,但是如果导入的包不在依赖中管理就需要手动配置版本了。
7.2 启动器 spring-boot-starter
sprint-boot-starter-xxx 就是spring-boot的启动器
例如 引入spring-boot-starter-web之后,springboot就自动导入了web模块运行的所有组件
springboot将所有功能场景抽取出来,做成一个个starter,需要使用那个功能,引入对应的starter即可,所有相关的依赖都会导入进来。也可自定义starter。
7.3 原理分析
7.3.1 注解功能划分
@SpringBootApplication 标记被修饰的类是一个springboot的应用
@SpringBootConfiguration 标记为一个springboot的配置类(springboot提供的)
@Configuration 标记为spring的配置类(spring提供的)
@Component 标记spring的一个组件
@EnableAutoConfiguration 开启自动配置
@AutoConfigurationPackage 自动配置包
@Import(AutoConfigurationPackages.Registrar.class) 导入注册器(包注册)
@Import(AutoConfigurationImportSelector.class) 导入了选择器
7.3.2 如何自动扫描(默认扫描启动类所在的包及其子包)
@Import(AutoConfigurationPackages.Registrar.class),在Registrar中,register()方法
7.3.3 如何加载自动配置类
先找到@Import(AutoConfigurationImportSelector.class)
在类中找到 getAutoConfigurationEntry()方法
进入 getCandidateConfigurations()方法,spring的加载工厂去筛选所有引入(link)EnableAutoConfiguration的配置类,EnableAutoConfiguration是key,返回的list是value
接着进入 loadFactoryNames()方法
查看 MATE-INF/spring.factories文件,从候选方法中获取到了需要自动配置的全限定类名的集合,再回到一开始的加载候选的方法
最后回到 getAutoConfigurationEntry()方法向下执行
踢出掉不需要的自动配置类(pom.xml中没有加入依赖的)
7.4 如何加载前端控制器(DispatcherServlet)
7.4.1 ssm中,需手动创建 DispatcherServlet,然后注入到Servlet容器中
7.4.2 在springboot中,只需要引入web的starter,就默认做好了
7.4.2.1 查看 DispatcherServletAutoConfiguration 自动配置类
@AutoConfigureOrder(Ordered.HIGHEST_PREREDENCE) 配置加载的顺序
@ConditionalOnWebApplication(type=Type.Servlet) 当前配置类需要web环境,如果没有web环境则不装配
@ConditionalOnClass(DispatcherServlet.class) 当前配置类需要DispatcherServlet类
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)当前配置类在web服务配置后加载
在DispatcherServletConfiguration方法中使用@Bean(name="dispatchetServlet") 创建DispatcherServlet对象注入到IOC容器中
8.springboot的run方法做了什么
初始化SpringBootApplication实例对象
判断当前应用是否为web应用
查找并加载可用的初始化类,设置在initializers属性中
找到所有应用的监听器,设置在listener中
推断并且设置main方法的定义类,找到运行的主类
9.springboot提供了那些自动配置类
查看地址:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters
需要使用,引入对应的starter即可,只需自定义一些参数,因为已有默认配置。如果需要的组件没有starter,则需自行编写
10.springboot配置文件语法[重中之重]
10.1 首先引入依赖 spring-boot-configuration-processor
10.2 创建Hero类,使用@ConfigurationProperties(prefix="hero") 此注解表示使用hero前缀去ioc容器中读取配置文件,使用@Component注解标记为spring的一个组件,@Data自动生成get、set
属性有 id、age、name、Date birth、String [] bobby、list、set、map
10.3 properties方式
hero.id=1、hero.age=10、hero.name=zs、hero.birth=2010/12/19、hero.bobby=C,P,J、hero.list=C,P,J、hero.set=f,b,s、hero.map.k1=v1 hero.map.ke=v2
10.4 yml方式 查看参考资料。如果properties和yml方式都存在,properties优先级更高
10.5 测试 使用 @Autowired 注解修饰注入Hero
10.6 配置文件占位符:yml文件中 可使用 ${random.int}占位符生成随机值
10.7 配置文件读取IOC容器中的值 yml文件中可使用${hero.age}作为name属性的value
10.8 propertie和yml两种文件说明
properties有配置则从properties中获取,没有配置则从Yml文件中获取。
两种文件是互补的存在
11.@Value读取配置文件
11.1 自定义类后,在属性上使用@Value("${hero.id}") private Integer id; ${hero.id} 对应的值是yml文件中的数据
11.2 @Value只能注入普通的属性(基本数据类型String,Date),其它的复杂类型是不能取到值的(如果yaml配置是array:c,j。是可以获取到值的);如果属性使用的是驼峰命名法,不能
使用属性名注入,要使用@Value("${her.class-name}")来取值,不可使用@Value("${hero.className}")
11.3 @Value和@ConfigurationProperties比较
功能:@ConfigurationProperties批量注入文件的属性 、 @Value一个个绑定
松散绑定:@ConfigurationProperties支持 、 @Value不支持
SpEL:@ConfigurationProperties不支持 、 @Value支持
JSR303数据校验:@ConfigurationProperties支持 、 @Value不支持
复杂类型封装:@ConfigurationProperties支持 、 @Value不支持
扩展:SpEL是一种表达式语言,用于在spring框架中动态操作数据;JSP303是java的bean validation的规范,用于验证java bean的属性。
12.注解验证
12.1 引入依赖 springboot2.3.x之后,需单独引入spring-boot-starter-validation依赖,之前web模块中已包含
12.2 在需要验证的类上添加注解@Validated,在需要验证的属性上添加注解修饰,例如@Email(message="邮箱不合法"),使用一个错误的邮箱,测试查看对应属性即可看到"邮箱不合法"的输出
12.3 常用的验证注解:
@NotNull 不可为null,可空着不写(可为空)
@NotEmpty 不可为null,不可为空,可为空格""
@NotBlank 不可为null,不可为空,不可为空格""
@Min 最小值
@Max 最大值
@Size(min=1,max=6) 长度限制
@Range(min=1,max=2) 范围限制
@Pattern(regexp"[0,1]{1}") 正则限制
13.@PropertySource和@ImportResource的使用
13.1 为何使用@PropertySource
使用@ConfigurationProperties和@Value的注入方式,配置文件都是在application.properties或application.yml文件中。
使用@PropertySource可将配置文件不写在 application.properties和application.yml中
13.2 注入优先级问题:所有的配置都是优先注入application.properties或application.yml中的数据。如果要使优先级不一样,则需要修改配置文件的前缀
13.3 @PropertySource注解的使用
@PropertySource(value={"classPath:hero.properties"}) //properties配置文件的指定
@ConfigurationProperties(prefix="hero") //使用hero前缀去ioc容器中读取配置文件
13.4 创建hero.propertie配置文件,并配置对应属性值
13.5 使用@Autowired注入Hero对象,使用@Test修饰的方法输出hero.测试类上使用@SpringBootTest注解修饰
13.6 为何使用@ImportResource
使用@PropertySource注解可不使用spring以前的xml配置文件的方式,如果还想使用spring的xml的配置方式,使用@ImportResource
13.7 创建实体类Hero4
13.8 创建beans.xml,将hero4注入为bean
13.9 启动类添加注解@ImportResource(locations={"classpath:beans.xml"})
13.10 测试类中使用@Autowired注解注入Hero4,输出查看即可
14.Profile配置文件详解
14.1 为何要使用profiles
开发中,一般有开发环境和生产环境,两套环境。有时开发环境和生产环境的配置不一样,想要快速切换,便需要使用profiles文件
14.2 创建 application-dev.xml,application-pro.xml,
14.3 修改application.xml 中spring.profiles.active对应的值为dev或pro,激活那个配置文件,就会使用那个配置文件进行运行
14.4 打jar包部署运行测试 命令:java -jar 01-spring-boot-hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
15.配置文件加载优先级和外部配置文件
15.1 项目内部配置文件
springboot启动会自动扫描application.properties或application.yml作为springboot的默认配置文件,同一目标下的properties文件的优先级高于yml文件
15.1.1 配置文件可以放的位置及其优先级排序从高到底,具体图片效果可查看参考资料 15.1.1
file:./config/
file:./
classpath:/config/
classpath:/
15.1.2 查看ConfigDataEnvironment
15.1.3 测试时,需要修改pom文件的编译路径,确保所有的配置文件都编译后测试
15.2 外部的配置文件
在服务器某磁盘位置保存一个application.yml或application.properties文件,指定端口为8009,打包后通过以下命令运行
java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.yml
不使用本地的配置文件,也可使用命令行参数指定(例如指定端口和上下文路径)
java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8888 --server.servlet.context-path=/activity
16.自动配置原理以及@Conditional派生注解
16.1 自动配置
springboot在启动时,
去扫描加载了所有引入依赖的jar包下面的MATE-INF/spring.factories文件,
然后通过EnableAutoConfiguration为key,所有自动配置类的全限定名为value(list)
经过筛选排除掉pom中没有添加依赖的配置类
最后将list中符合条件的自动配置类的全限定类名添加到IOC容器中进行管理,从而实现了自动配置原理
16.2 以HttpEncodingAutoConfiguration为例来理解自动装配 具体内容查看参考资料16.3
16.3 总结
springboot启动会加载大量的配置类;
需要的功能,springboot有无默认写好的配置类;
配置类中有的组件,无需再配置
给容器中自动配置类添加组件时,会从properties类中获取某些属性,便可在配置文件中指定这些属性的值
xxxxAutoConfiguration 自动配置类,给容器中添加组件
xxxxProperties 封装配置文件中的默认配置
16.4 @Conditional 派生注解
必须是@Conditional指定的条件成立,才给容器中添加组件,配置类中的内容才会生效。(条件之间是并且的关系)
@Conditional扩展注解
@ConditionalOnBean 容器中存在指定Bean
@ConditionalOnMissingBean 容器中不存在指定Bean
@ConditionalOnClass 容器中存在指定类
@ConditionalOnMissionClass 容器中不存在指定类
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
16.5 配置文件中配置debug=true,让控制台打印自定配置报告,便可得知那些自动配置类生效
17.整合logback
17.1 概述
系统运行,日志不可或缺。可调试程序、记录运行状态、排查问题。
springboot内部集成了LogBack日志依赖,默认使用Logback记录日志信息,默认根据base.xml配置内容来输出到控制台和文件中,但是默认配置达不到企业级项目的要求。
17.2 创建 logback-spring.xml,完整内容可查看参考资料 17.3
日志级别从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL 如果设置为WARN,则低于WARN的信息都不会输出
scan:此属性设置为TRUE时,配置文件发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给定时间单位,默认单位是毫秒。当scan为true时,此属性生效,默认时间为1分钟
debug:此属性设置为true,将打印logback内部日志信息,实时查看Logback内部运行状态,默认为false
17.3 修改启动类测试,启动类上使用@Slf4j注解修饰,即可在main方法中使用log.error、warn、info、debug、trace方法输出内容
启动输出之后,即可在本地对应路径看到生成的.log文件
18.AOP开发
18.1 概述
aop是spring的两大功能模块之一,为解耦提供了有些的方案。
springboot集成aop拦截业务组件很方便
AOP作用:不修改源代码前提下,对类中的方法进行增强(前置、后置、环绕、异常)
18.2 创建项目并添加maven依赖 org.springframework.boot spring-boot-starter-aop
18.3 创建任意测试类Man,将此类添加至IOC容器管理(AOP作用的类必须添加至IOC容器),
18.4 根据任意测试类创建此类的切面类,也将切面类添加至IOC容器管理,使用@Aspect注解修饰;
类中指定切入点,编写4个增强方法,前置、后置、环绕、异常对应方法上分别使用@Before、@After、@Around、@AfterThrowing注解修饰
18.5 测试类中注入测试类,调用方法既可看到对应的增强AOP效果
18.6 代理方式的切换
springboot2.x之后,代理方式的切换需要在配置文件中配置,使用注解切换方式失效
修改application.yml文件的切换代理方式:
spring:aop:proxy-target-class:true ## false表示使用JDK代理,true表示使用CGLIB代理
springboot2.x之后,代理方式默认使用CGLIB
19.WEB静态资源访问规则
19.1 springboot访问静态资源的方式
查看WebMveAutoConfiguration中的静态类WebMvcAutoConfigurationAdapter
关于资源管理的方法addResourceHandlers
方法中可看到静态资源的4个存放位置,
如果4个位置都有相同的文件,访问优先级顺序为:META-INF/resources>resources>static>public
19.2 自定义静态资源访问方式
19.2.1 自定义方式1-yml配置文件方式
sprinb:
web:
resources:
static-locations: classpath:/mystatic/ ##静态资源存放的路径
mvc:
static-path-pattern: /static/** ## 访问MVC的路径映射
19.2.2 java方式
自定义配置类(使用@Configuration修饰)实现WebMvc的配置WebMvcConfiger,并重写静态资源配置的方法 addResourceHandlers
19.3 webjars的访问规则
19.3.1 webjars是什么
webjars是打包到JAR(java archive)文件中的客户端web库(例如jquery和bootstrap)
在基于JVM的web应用程序中管理客户端依赖项
使用JVM的构建工具(如maven、gradle、sbt)来下载客户端依赖项
了解正在使用的客户端依赖项
传递依赖关系可自动解析,并可通过requirejs来加载
官网:https://www.webjars.org/
19.3.2 引入依赖 org.webjar.jquery 3.6.0
19.3.3 启动方位 http://localhost:8080/webjars/jquery/3.6.0/jquery.js
20.Thymeleaf模板的使用[了解]
20.1 Thymeleaf概述
Thymeleaf是与Velocity、FreeMarker 类似的存储引擎。可完全替代JSP。相较其他模板引擎,有以下三特点:
1.有无网络皆可运行。可在浏览器查看静态效果,也可在服务器查看带数据的动态页面效果。原因是它支持html原型,然后在html标签中增加额外的属性来达到模板+数据的展示方式。
浏览器解释HTML时会忽略未定义的标签属性,所以thymeleaf可以静态的运行;当有数据返回时,thymeleaf会动态地替换掉静态内容,使页面动态显示。
2.Thymeleaf开箱即用的特性。提供标准和spring标准两种方言,可直接套用模板实现JSRL,OGNL等表达式效果,避免每天改模板,改list,改标签的困扰。同时开发人员可扩展和创建自定义的方言。
3.Thymeleaf提供spring标准方言和一个与springmvc完美集成的可选模块,可快速实现表单绑定,属性编辑器,国际化等功能
20.2 创建项目并添加thymeleaf的依赖
20.3 Spring Boot项目Thymeleaf模板页面存放位置
查看Thymeleaf自动配置类 ThymeleafAutoConfiguration,自动配置类中有ThymeleafProperties类(关联配置文件类)。也可在yml文件中通过spring.thymeleaf.prefix修改页面存放位置
20.4 通过Controller跳转到Thymelaef界面
20.4.1 在指定位置下创建hello.html
20.4.2 创建HelloController,使用@Controller修饰,类中写方法 @GetMapping("hello")public String hello(){return "hello";}
20.4.3 调用 http://localhost:8080/hello 测试访问即可
20.5 Themeleaf的相关语法
官网地址:https://www.thymeleaf.org/ 常用表达式可查看参考资料20.5
20.6 Thymeleaf读取model中的对象
20.6.1 创建实体类Hero类
20.6.2 在RouteController方法中,增加一个方法跳转"showHERO"
20.6.3 创建showHERO界面
20.6.4 测试访问: hhttp://localhost:8080/showHERO
20.7 Thymelfaf读取 Model中某个集合
20.7.1 在RouteController中增加一个方法跳转,返回值为 return "showHeroList";
20.7.2 创建showHeroList界面
20.7.3 测试访问 http://localhost:8080/showHeroList
20.8 ThymeLeafObjects的使用
20.8.1 在RouteController中增加一个方法跳转,返回值为 return "showObj"
20.8.2 创建showObj界面
20.8.3 测试访问 http://localhost:8080/thymeleafObject/showObj
20.9 ThymeLeaf在js中取值
例如:let name = "[[${name}]]"
20.10 ThymeLeaf链接传值
20.10.1 创建一个按钮,点击传值
20.10.2 在RouteController中增加一个方法,返回值为return "ok",方法使用@ResponseBody注解修饰
21.springboot自动管理MVC的分析
21.1 查看WebMvcAutoConfiguration及其内部静态类 MVC做了那些事情?
请求分发-dispatcherservlet
适配器-requestmappinghandlerAdapter
消息转换-messageconverter
视图解析-contentnegotiatingviewresolver
格式化-addformatters
21.2 具体查看视图解析
在 contentnegotiatingviewresolver 内容视图协商解析器中初始化servletContext时,把加载的所有视图解析器收集了起来(只要IOC容器中实现了viewresolver接口的,都可被收集起来)
21.3 具体查看文件上传下载
MultipartAutoConfiguration已自动配置
MultipartProperties配置文件中可设定参数,可在yml文件中配置
21.4 具体查看格式化(接收页面参数并转化)
在WebMvcAutoConfiguration的addFormatters方法中,默认配置了很多转换规则,也可在配置文件中自行设置,例如 spring:mvc:formar:date-time:yyyy-MM-dd HH:mm:ss
format.date 对应java.utils.date
format.date-time 对应java.time.LoaclDateTime
21.5 欢迎页面自动配置
在WebMvcAutoConfiguration中的WelcomePageHandlerMapping方法下的getWelcomePage方法中的getIndexHtml中,指定了index.html
22.扩展MVC的组件[了解]
自定义类实现WebMvcConfigurer重写之前的方法即可实现自定义拓展
22.1 自定义视图解析器[熟悉],可省略controller
实现方式:重写addViewControllers方法
22.2 自定义拦截器[掌握]
22.2.1 创建自己的拦截器
自定义类实现 HandlerInterceptor 接口,重写preHandle(返回true即放行,否则拦截)、postHandle、aftersCompletion方法
22.2.2 注册到webmvc管理
自定义类重新 addInterceptors方法,通过 InterceptorRegistry的addInterceptor方法将自定义的拦截器注册进来,并可通过addPathPatterns和excludePathPatterns设置拦截路径和放行路径
23.注册Web三大组件[重点]
Servlet @WebServlet web.xml
Filter @WebFilter web.xml
Listener @WebListener web.xml
23.1 注册自己的Servlet
可模仿DispatcherServlet的注册方式
23.1.1 创建自定义Servlet,UserServlet继承HttpServlet,重写doGet和doPost方法,类上使用@Component进行修饰
23.1.2 配置类中注册自己的Servlet,配置类使用@Configuration注解修饰,类中创建自定义方法,使用@Bean修饰,方法中使用ServletRegistrationBean的setServlet方法将UserServlet注册
23.2 注册自己的Filter
23.2.1 创建自定义Filter,MyFilter实现Filter接口,重写doFilter方法,类使用@Component注解修饰
23.2.2 配置类中注册自己的Filter,类中创建自定义方法,使用@Bean修饰,方法中使用FilterRegistrationBean的setFilter方法将MyFilter注册
23.3 注册自己的Listener
23.3.1 创建自定义Listener,实现ServletContextListener接口,重写contextInitialized和contextDestoryed方法
23.3.2 配置类中注册自己的Listener,类中自定义方法,使用@Bean修饰,方法中使用 ServletListenerRegistrationBean的setListener方法将MyListener注册
24.数据源配置和自动管理[重中之重]
24.1 创建项目选择依赖
Lombok、Spring Web、JDBC API、 MySql Driver
24.2 创建数据库和对应的表
24.3 使用DriverManagerDataSource
24.3.1 修改配置文件
spring:
datasource:
driver-class-name:com.mysql.cj.jdbc.Driver
type:org.springframework.jdbc.datasource.DriverManagerDataSource #spring自带数据源
url:jdbc://localhost:3306/test?serverTimeZone=GMT%2B8
username:root
password:root
24.3.2 测试
自定义测试类,类使用@SpringBootTest修饰,使用@AutoWired注入DataSource,自定义方法使用@Test修饰,输出dataSource结果为DriverManagerDataSource即成功
24.4 使用Druid数据源[自己配置]
24.4.1 添加Druid依赖 com.alibaba.druid
24.4.2 添加MyDruidProperties配置类,类上使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ConfigurationProperties(prefix="my.druid")修饰,
包含初始化链接数-initialSize、最大链接活跃数-maxActive、最小链接数-minIdle、检查的sql语句-validationQuery、
监控配置-StatView(监控登录用户名-loginUsername、监控登录密码-loginPassword、白名单-allow、黑名单-deny、映射路径-String[] urlMapping)等属性
24.4.3 添加 MyDruidAutoConfiguration 自动配置类,
类上使用@Configuration、@EnableConfigurationProperties(MyDruidProperties.class) //指定配置类、@ConditionalOnClass(DataSource.class)//必须有DataSource类才生效 修饰
类中使用@Autowired注入@MyDruidProperties
类中编写创建数据源的方法,方法名自定义,方法返回值为DruidDataSource,方法使用@Bean修饰
类中编写将MyDruidProperties注册Servlet的方法,方法返回值为ServletRegistrationBean<StatViewServlet>
24.4.4 修改yml配置文件
my:
druid:
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
initial-size:2
max-active:10
min-idle: 3
validation-query: select 'x'
state-view:
login-username: admin
login-password: admin
allow:
deny:
url-mapping:
- /druid/*
24.4.5 测试访问 http://localhost:8080/druid
24.5 使用Druid数据源[官方starter]
pom.xml中添加com.alibaba.druid-spring-boot-starter依赖 1.2.6版本
24.5.1 修改配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.driver
url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimeZone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
max-active: 10
min-idle: 2
validation-query: select 'x'
stat-view-servlet:
login-username: admin
enabled: true #启动监控页
login-password: admin
allow:
deny:
url-pattern: /druid/*
25.集成mybatis[重点]
25.1 创建数据库并新增测试数据
25.2 创建新模块并添加依赖 org.mybatis.spring.boot.mybatis-spring-boot-starter、mysql-connector-java、druid-spring-boot-starter、lombok、spring-boot-starter-test、
spring-boot-starter-web
25.3 根据数据库创建对象(逆向工程)
25.4 修改yml配置文件
在24.5.1 配置文件基础上进行修改,添加以下文件
mybatis:
mapper-locations: classpath:mapper/*.xml #mapper.xml文件所在位置
configuration:
log-impl: org.apache.itatis.logging.stdout.StdOutImpl #sql日志输出
25.5 修改启动类
添加注解 @MapperScan(basePackages={"com.ss.mapper"})
25.6 查询测试
创建测试类,使用@SpringBootTest修饰类,使用@Autowired注入UserMapper;测试方法使用@Test修饰,方法中使用UserMapper的查询方法,验证查询结果即可
25.7 使用注解方式
mapper接口的方法上使用注解的方式
@Select("select * from user")
List<User> selectAllUser();
25.8 配置PageHelper插件分页(第一种方式,不推荐使用)
25.8.1 添加 pagehelper 依赖 com.github.pagehelper pagehelper
25.8.2 创建mybatis-cfg.xml
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
25.8.3 修改application.yml文件
mybatis:
mapper-locations: classpath:mapper/*.xml #mapper.xml文件路径
config-location: classpath:mybatis-cfg.xml #指定配置文件
25.8.4 测试分页
方法中第一行先写 Page<User> page = PageHelper.startPage(1,2);最后再调用usermapper查询所有用户的方法,输出结果即可验证
25.9 配置PageHelper插件分页(第二种方式,推荐使用)
25.9.1 依赖pagehelper的starter
groupId:com.github.pagehelper
artifactId: pagehelper-spring-boot-starter
25.9.2 删除Mybatis-cfg.xml后修改application.xml文件
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #sql日志输出
mapper-locations: classpath:mapper/*.xml #mapper.xml文件位置
## config-location: classpath:mybatis-cfg.xml #此配置移除
25.9.3 测试查询分页
方法中第一行先写 Page<User> page = PageHelper.startPage(1,2);最后再调用usermapper查询所有用户的方法,输出结果即可验证
25.10 事务管理
和spring一样,但是springboot只需要再serviceImpl类或方法添加@Transactional注解即可
26.使用外部tomcat[了解]
springboot内置的tomcat不支持jsp,使用的模板引擎是[thymeleaf]
26.1 创建项目,选择打包方式为war
26.2 选择依赖
spring web 、 lombok
26.3 配置pom.xml,添加以下依赖
groupId:org.springframework.boot
artifactId:spring-boot-starter-tomcat
##加入内嵌tomcat对jsp的支持
groupId:org.apache.tomcat.embed
artifactId:tomcat-embed-jasper
##servlet依赖
groupId:javax.servlet
artifactId:javax.servlet-api
##jstl依赖
groupId:javax.servlet
artifactId:jstl
groupId:taglibs
artifactId:standard
26.4 添加idea配置 具体操作可查看参考资料26.4图片
26.5 配置外部tomcat 具体操作可查看参考资料26.5图片
26.6 新建controller,定义方法返回结果为 return "test",方法的请求路径为test
26.7 创建test.jsp界面
26.8 修改配置文件
spring:
mvc:
view:
prefix: /WEB-INF/view/
suffix: .jsp
26.9 启动访问 http://localhost:8080/test
27.集成swagger[熟悉]
27.1 问题描述
随着技术的发展,现在网站架构基本都变成前端渲染、前后端分离的形态。
而且前后端在各自的道路上越走越远,前后端的唯一联系变成了API接口;
API文档称为了前后端开发人员联系的纽带。
swagger是一款更好书写API文档的框架,而且swagger可完全模拟http请求,入参和实际情况差别几乎为零。
27.2 使用步骤
27.2.1 创建项目并加入依赖
groupId:io.springfox
artifactId:springfox-boot-starter
27.2.2 创建SwaggerProperties信息配置类
使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ConfigurationProperties(prefix="swagger3")注解修饰配置类
配置类包含以下属性:
basePackage-扫描的包,给这个包下面创建文档
name-作者姓名
url-作者主页链接
email-作者邮箱
version-版本号
groupName-分组名称
title-文档标题
description-文档描述
termsOfServiceUrl-组织地址
license-许可证
licenseUrl-许可证链接
27.2.3 创建SwaggerAutoConfiguration自动配置类
类注解使用@Configuration、@EnablaOpenApi(开启swagger的功能,旧版本是EnableSwagger2)、@EnableConfigurationProperties(SwaggerProperties.class)修饰
类中使用@Autowired注入SwaggerProperties
类中定义docket方法,返回值为Docket,方法使用@Bean注解修饰。修饰符为public
类中定义getApiInfo方法,返回值为ApiInfo,修饰为private,用于在docket方法中使用
27.2.4 修改yml配置文件
swagger3:
base-package: com.ss.controller
name: ss
url: https://gitee.com/ss
email: xxx@xx.com
version: 1.0
group-name: ss
title: "测试"
description: "测试swagger文档"
terms-of-service-url: https://gitee.com/ss
license: ss
license-url:https://gitee.com/ss
spring:
jackson:
date-format:yyyy-MM-dd HH:mm:ss
time-zone:GMT+8
mvc:
format:
date-time:yyyy-MM-dd HH:mm:ss
27.2.5 创建hero类
类上使用@Data、@AllArgsConstructor、@NoArgsConstructor、@ApiModel("英雄对象") #描述实体类
类中的属性使用@ApiModelProperty(value="属性描述")
27.2.6 创建Controller
类上使用注解@Api(tags="接口描述")
类中的方法上使用@Apioperation("方法作用描述")
类中的方法如果有基本数据类型的参数,可使用@ApiImplicitParam(name="参数名",value="参数含义",required=true,paramType="path/query",dataType="数据类型")
27.2.7 测试访问文档页面
http://localhost:8080/swagger-ui/index.html
27.2.8 swagger界面进行接口测试 具体操作可查看参考资料 27.2.8
27.2.9 补充注解说明
@Api 属性有value和description,用于修饰类
@ApiProperties 属性有value和notes,用于修饰方法,参数的描述容器
@ApiImplicitParams 属性为@ApiImplcatParam数组,用于修饰方法,参数的描述容器
@ApiImplicitParam
name 与参数名对应、value-参数中文描述、required-是否必填(true/false)、dataType-参数类型、
paramType-参数请求方式(query/path,query对应Parameter ?传递;path对应PathVariable path传递)
defaultValue 默认值
28.spring boot异步
java中异步就是多线程
springboot中的异步是种快速使用多线程的方式
28.1 概述
28.1.1 什么是异步调用
异步调用是相较于同步调用而言,同步调用是指按照程序预定顺序一步步执行,每一步必须等上一步执行完之后才可执行。异步调用则无需等待上一步执行完便可执行。
28.1.2 如何实现异步调用
多线程是一种实现异步调用的方式。
非springboot项目中实现异步调用使用的就是继承thread类或实现runnable接口,或jdk1.5以上提供的executors线程池。
springboot项目则提供了很方便的方式执行异步调用
28.2 实践
28.2.1 创建项目并选择依赖 lombok、spring web
28.2.2 创建异步任务类AysncTask,类使用@Component注解修饰,编写3个方法,使用@Async修饰。3个方法分别休眠1、2、3秒。
28.2.3 创建自定义controller,使用@Autowired注入AsyncTask,方法中分别调用AsyncTask的3个方法。最终3个方法共计耗时3秒即异步执行
29.springboot定时任务
例如需求:每天晚上11点将前一天的报表数据进行统计。
实现方案:
写一个每天晚上11的定时任务,此任务从数据库中统计数据
29.1 概述
springboot定时任务是与quartz整合,无需添加任何依赖
在springboot项目启动类上添加注解@EnableScheduling开启定时调度
在需要定时调度的方法上添加@Scheduled注解,其中可指定cron表达式和其他的定时方式
29.2 实践
29.2.1 启动类添加注解 @EnableScheduling 开启定时任务
29.2.2 指定定时任务,方法上使用@Scheduled注解修饰,方法必须是无参无返回值,例如 public void test()
@Scheduled有两种用法
其一:固定速率。
fixedDelay=2000(规定延迟2秒执行一次)
fixedRate=2000(固定过2秒执行一次)
initialDelay=2000 fixedRate=5000 首次执行延迟2秒执行,后续按照fixedRate的规则(过5秒)执行
其二:cron表达式,cron表达式生成地址:https://www.matools.com/cron/
常用cron表达式:从做到有分别表示的含义为 秒 分 时 日 月 周 年(周的范围是从1-7。为1表示周日,为7表示周六)
每秒执行一次:* * * * * ? *
每分钟执行一次:0 * * * * ? *
每小时执行一次:0 0 * * * ? *
每天凌晨2点执行一次:0 0 2 * * ? *
每周周一凌晨两点执行一次:0 0 2 ? * 2 *
每月1号凌晨两点执行一次:0 0 2 1 * ? *
每年1号凌晨两点执行一次: 0 0 2 1 1 ? *
30.springboot邮件
30.1 概述
springboot默认有starter集成了mail。spring-boot-starter-mail
30.2 实践
先从邮箱设置smtp开启,并获得授权码
30.2.1 添加依赖
groupId:org.springframework.boot
artifactId:spring-boot-starter-mail
30.2.2 修改application.yml配置文件
spring:
mail:
host: smtp.qq.com #配置服务器qq:smtp.qq.com,网易163:smtp.163.com
username: 邮箱账户
password: 邮箱密码
default-encoding:UTF-8
30.2.3 测试
使用@Autowired注入JavaMailSender对象,使用JavaMailSender的send(MimeMessage)方法或send(SimpleMailMessage)即可发送
MimeMessageHhelper在邮件中添加附件内容。
31.补充内容
实现CommandLineRunner接口,项目启动后会自动执行类中的run方法。应用场景:将数据库中的数据保存到redis缓存中
redis是单线程
参考资料:https://blog.csdn.net/m0_47946173/article/details/134659362
参考资料:https://blog.csdn.net/m0_47946173/article/details/134804733