SpringBoot是什么?
springBoot是整合spring技术栈的一站式框架同时也是简化技术栈的快速开发脚手架
SpringBoot优点
1.创建独立的Spring应用
2.内嵌web服务器不再需要部署Tomcat打war包,jar包即可运行项目
3.自动Start依赖,简化了导入许多jar包
4.自动配置Spring以及第三方功能(mysql、redis)
5.提供生产级别的监控、健康检查及外部化检查
6.无代码胜场、无需编写 xml
微服务背景故事
云原生作为下一步的学习计划
SpringBoot文档架构
Maven的就近原则
因为springboot的父类
<artifactId>spring-boot-starter-parent</artifactId>
父类里包含了很多的依赖并且带有版本
<artifactId>spring-boot-dependencies</artifactId>
想要修改版本并且不受父类中的依赖影响是因为MAVEN的“就近原则”与”约定大于配置“
<properties>
<mysql.version>5.0.43</mysql.version>
</properties>
Spring Boot Reference Documentation
Using Spring Boot
SpringBoot给我们简化的依赖管理体现
spring-boot-starter-*的含义
*代表某种场景,有了前缀就可以吧web场景所依赖的jar引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
springboot的核心依赖
spring-boot-starter
springboot的第三方依赖
*-spring-boot-starter
SpringBoot是如何IOC控制反转的
public static void main(String[] args) {
//返回Springboot自带的IOC容器
ConfigurableApplicationContext run = SpringApplication.run(GoodveryApplication.class, args);
//2.查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
由此得出springboot帮我们配置好了所有web开发的场景(eg:解决了字符编码的问题)
springboot自动配置了包的扫描
在Spring Boot Reference Documentation - Using Spring Boot - Structuring Your Code - Using the “default” Package中可得下图
在主程序下面的包与包下面的子包里面的组件都会被默认扫描(controller包就可不配置扫描即可重定向与转发)
也就是说主程序需要放在最里面的文件夹不然就扫描不到
如需要自定义主程序放包的位置则需要配置该注解↓
由于@SpringBootApplication =
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan可这样写↓
一个application.properties里面具有所有配置的默认值
默认配置最终映射到MultipartProperties
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
按需加载所有自动配置项
非常多的starter
引入了那些场景,那些场景就会自动开启。
springboot的所有自动配置功能都在下面这个包
该包的使用场景↓
开启改包的使用↓
@Configuration//告诉SpringBoot这是一个配置类 == 配置文件相当于免去xxx.xml文件
@Bean //给容器中添加组件,以方法名作为组件的id,返回类型是组件的类型,返回值,就是组件在容器中的实例。
@Bean("xxx")
配置类里面使用该注解标注在方法上给容器注册组件,默认也是单实例的
无论获取多少次都是一样的,所以是默认是单实例的
![](http://upload-images.jianshu.io/upload_images/23643532-20d7d48d37796f22.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/871/q/50
spring5新特性,springboot2最大的更新 spring5新特性,springboot2最大的更新
@Bean(proxyBeanMethod = true)full模式代理对象调用方法
使其多次调用同一方法方法保持组件单实例
@Bean(proxyBeanMethod = false)lite模式
如果组件之间没有依赖则设置为false会更快,因为跳过了检查配置类里面有没有一样的springboot启动更快
@import用法
条件装配
@conditionaleg:@Conditionalbean(name="xxx")当存在xxx这个名称的bean下面的方法才会生效
@ImportResource("classpath:xxx.xml")
该注解使用场景在因为旧版本的xxx.xml配置很多,而需要重新解析放到容器中就可以重新读取该xml文件
配置绑定,将properties中的配置绑定到javabean中
方法1
@ConfigurationPerproties(prefix=“mycar“)
将.properties配置文件中的mycar.aaa/mycar.sss一一对应到@Component加载到容器中的实体类的属性aaa/sss一一对应
再通过@Autowired将实体类自动注入,写一个方法返回实体类绑定配置文件的内容
方法2
@ConfigurationPerproties(prefix=“mycar“)绑定配置文件的前缀
@EnableConfigurationProperties(实体类名.class)
自动配置原理入门
引导加载自动配置类
@SpringBootApplication
//是@SpringBootApplication的子集
//相当于@Configuration :代表当前为一个配置类
@SpringBootConfiguration
@EnableAutoConfiguration
//:指定扫描那些spring注解
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication
//是@EnableAutoConfiguration的子集
@EnableAutoConfiguration:重要注解
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationImportSelector.class)//给容器中创建该类型的组件
public @interface EnableAutoConfiguration
//是@AutoConfigurationPackage的子集
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
//根据@Import(AutoConfigurationPackages.Registrar.class)可知注册了哪些一系列的组件
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
由下图可知Springboot的主程序xxxApplication将下面的所有组件注册进来
@Import(AutoConfigurationImportSelector.class)之AutoConfigurationImportSelector解析
上述可知:springboot是按需(按照@ConditionalOnClass("xxx")这种按照条件装 配规则)加载自动配置
框架 = 注解 + 反射 + 算法
修改默认配置
总结:
Spring先加载所有的配置类
每个自动的配置类按照条件生效
生效的配置类给容器装配许多组件
容器有容器就代表组件生效,该组件的功能就生效
用户自定义的组件且容器组件生效的则用户配置的组件优先
不看文档怎么知道.Properties配置有哪些属性(以缓存相关为例cache)
1.打开该自动配置的包
2.打开cache类
3.根据该properties绑定
4.然后就知道以这个为开头启动cache配置
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓由上述的SpringBoot配置原理得出使用SpringBoot最佳实践↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
引入场景依赖
查看自动配置哪些
1.查看包
2.自己分析
配置文件配置 debug=true生成配置报告启动项目控制台看到下图内容就是不生效的
是否需要修改:
参照文档修改配置项
自定义加入或者替换组件
@Bean、@Component
自定义器 xxxCustomizer;
...
Lombock简化开发
@slf4j注解的使用
热部署的使用之(Restart)
热部署的使用之(Reload) JRebel
Spring Initializr快速创建SpringBoot项目
SpringBoot2核心技术-核心功能SpringBoot2核心技术-核心功能
配置文件
.properties
.yml既是也不是标记语言的语言,适合以数据为中心的配置文件
基本语法
key: value kv之间有空格
大小写敏感
缩进不允许使用tab,只允许空格
缩进的空格不重要,只要相同的层级的元素左对齐即可
‘#’表示注释
''与""表示字符串内容会被转义/不转义
.propertie与.yaml配置文件用法对比
配置propertie
@ConfigurationProperties(prefix = "person")注解用法案例
配置yaml
数组里面写对象
SpringBoot之Web开发SpringBoot之Web开发SpringBoot之Web开发
Spring Boot Features
Profiles, Logging, Security, Caching, Spring Integration, Testing, and more.(配置文件,日志记录,安全性,缓存,Spring集成,测试等)
Developing Web Applications(之使用Web应用)
Static Content 静态资源的访问
静态资源目录
called /static (or /public or /resources or /META-INF/resources
通过项目根路径 + 静态资源名即可访问到
底层实现访问到静态资源的实现原理
webjars将静态资源导入依赖
webjars.org
Welcome Page欢迎页的使用
问题:如果配置了静态资源的访问前缀就不可以使index.html被默认访问
静态资源配置原理
SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
- SpringMVC功能的自动配置类 WebMvcAutoConfiguration,使其生效注解如下。
@ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {
WebMvcAutoConfiguration 实现的功能:
给容器配了什么?
@Configuration(proxyBeanMethods = false) @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class, org.springframework.boot.autoconfigure.web.ResourceProperties.class, WebProperties.class }) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
配置文件的相关属性与xxx进行了绑定。
只有一个有参构造器
有参构造器所有参数的值都会从容器中确定
资源处理的默认规则
欢迎页的默认规则配置
请求参数处理:配置文件开启RestFul风格请求spring.mvc.hiddenmethod.filter.enabled=true
在springboot中如何支持get、post之外的请求 在WebMvcAutoConfiguration.java中配置好了
Rest原理(表单提交要使用REST的时候)
表单提交会带上_method = PUT
请求过来会被OrderedHiddenHttpMethodFilter拦截
个人总结:restful API请求方式默认有get/post请求,如果使用类似DELETE请求需要手动启动配置,WebMVCAutoConfiguration就会启动HiddenHttpMethodFilter方法,此方法判断是否为POST请求并且是否正常,获取到兼容的POST请求中_method的值,HttpMethodRequestWrapper重写并调用getmethod的方法。
请求处理修改默认的_method
请求处理-映射请求执行原理源码解析 P28重新看整不明白
请求处理-常用参数注解使用
请求处理 - 源码分析 - 各种类型参数解析原理 P32
会用就行从P33跳过
请求处理 - 源码分析 - Model、Map原理
请求处理 - 源码分析 - 自定义参数绑定原理
请求处理 - 源码分析 - 自定义Converter原理
p37响应处理 - 源码分析 - ReturnValueHandler原理 p38跳过
p39响应处理 - 源码分析 - 内容协商原理(在不同情况返回不同的内容XML、json、xml要根据浏览器的接受能力)
p40响应处理 - 源码分析 - 基于请求参数的内容协商原理
p41响应处理 - 源码分析 - 自定义MessageConverter (不懂他的config文件跳过)
p42响应处理 - 源码分析 - 浏览器与Postman内容协商完全适配(不懂跳过)
p43视图解析-Thymeleaf初体验 (后端人员使用的模板引擎,缺点是不是高性能的模板引擎只适用于单体应用,高并发不适用,所以暂且不学) p44 p45 p46 p47 P48 P49跳过
p51文件上传-单文件与多文件上传 p52跳过
p52 错误处理-springboot默认错误处理机制 p53 - p55跳过
原生组件注入-原生注解与spring方式注入 (Servlet Filter Listener)
p57原生组件注入 - 源码分析 -DispatcherServlet注入原理
P58嵌入式Servlet容器 - 源码分析 -切换web服务器与定制化
数据访问 - 数据库场景的自动配置分析与整合测试
数据源自动配置-HikariDataSource
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8&&serverTimezone=GMT
jdbc.username=root
jdbc.password=0000
https://www.pianshen.com/article/5589774588/ (解决密码0000为什么会报错)
数据源自动配置-Druid数据源
1.官方文档
https://github.com/alibaba/druid
2.配置数据源
---------------------------------学了个寂寞↑↑↑↑↑↑↑---------------------------------------
p62简化版druid配置方式
1.导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
2.自动配置:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
整合mymatis操作注解版(属于第三方技术所以springboot官网没有)
整合官网:https://github.com/mybatis/spring-boot-starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
“resultType是针对于拿数据的时候用的,paramType是针对于存数据的时候用的”,虽然对,但说法有点不妥,很容易让新人产生误解,比如说我第一眼就以为要从resultType的值里拿数据,要把插入语句的结果保存到paramType中。 我的理解是:resultType是sql语句查询结果集的封装类型,也就是说把sql查询的结果封装在bean里返回回去,是存数据用的。 paramType是从传过来的Bean中取数据放进例如insert语句的values中当实参用,是取数据用的。
全注解版配置mybatis
快速开始网址:https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start
一劳永逸不需要在每个xxx.mapper文件标注@Mapper注解的方法
mybatis-Plus整合 完成CRUD功能
官方学习快速上手:https://mp.baomidou.com/
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
mybatis-plus实现分页
@GetMapping("/tab")
//@RequestParam(value = "pn",defaultValue = "1")请求前端的当前页,默认为第一页为当前页
public String tab(@RequestParam(value = "pn",defaultValue = "1")Integer pn, Model model){
//返回页面列表
List<User> list = userService.list();
//分页查询数据
Page<User> userPage = new Page<>(pn, 2);
//分页查询结果
IPage<User> page = userService.page(userPage, null);
//获取当前页
long current = page.getCurrent();
//获取总页数
long pages = page.getPages();
//获取总记录数
long total = page.getTotal();
//分页对象记录列表
List<User> records = page.getRecords();
model.addAttribute("page",page);
return "table/dynamic_table";
}
数据访问 - CRUD功能试验 - 删除用户完成
数据访问-准备阿里云redis环境
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 [字符串(strings)](http://www.redis.cn/topics/data-types-intro.html#strings), [散列(hashes)](http://www.redis.cn/topics/data-types-intro.html#hashes), [列表(lists)](http://www.redis.cn/topics/data-types-intro.html#lists), [集合(sets)](http://www.redis.cn/topics/data-types-intro.html#sets), [有序集合(sorted sets)](http://www.redis.cn/topics/data-types-intro.html#sorted-sets) 与范围查询, [bitmaps](http://www.redis.cn/topics/data-types-intro.html#bitmaps), [hyperloglogs](http://www.redis.cn/topics/data-types-intro.html#hyperloglogs) 和 [地理空间(geospatial)](http://www.redis.cn/commands/geoadd.html) 索引半径查询。 Redis 内置了 [复制(replication)](http://www.redis.cn/topics/replication.html),[LUA脚本(Lua scripting)](http://www.redis.cn/commands/eval.html), [LRU驱动事件(LRU eviction)](http://www.redis.cn/topics/lru-cache.html),[事务(transactions)](http://www.redis.cn/topics/transactions.html) 和不同级别的 [磁盘持久化(persistence)](http://www.redis.cn/topics/persistence.html), 并通过 [Redis哨兵(Sentinel)](http://www.redis.cn/topics/sentinel.html)和自动 [分区(Cluster)](http://www.redis.cn/topics/cluster-tutorial.html)提供高可用性(high availability)。
官网学习:http://www.redis.cn/
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
使用Redis记录请求执行的次数
单元测试
官方文档:https://junit.org/junit5/
单元测试--断言机制
单元测试 - 前置条件(假设)
指标监控 SpringBoot Actuator
management:
endpoints:
enabled-by-default: true #默认开启所有监控端点
web:
exposure:
include: '*' #以web方式暴露所有端点
指标监控 - 开启与禁用
定制-Endpoint
指标监控 - 可视化
官方地址:https://github.com/codecentric/spring-boot-admin
高级特性 - Profile环境切换
给配置文件绑定值
#通过此配置切换环境
spring.profiles.active=prod
@Profile绑定配置文件-条件装配
@Profile分组
外部化配置
意思:当项目部署时外部有个文件可以修改配置能修改数据库端口之类的配置文件
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
1. Default properties (specified by setting `SpringApplication.setDefaultProperties`).
2. [`@PropertySource`](https://docs.spring.io/spring/docs/5.3.5/javadoc-api/org/springframework/context/annotation/PropertySource.html) annotations on your `@Configuration` classes. Please note that such property sources are not added to the `Environment` until the application context is being refreshed. This is too late to configure certain properties such as `logging.*` and `spring.main.*` which are read before refresh begins.
3. Config data (such as `application.properties` files)
4. A `RandomValuePropertySource` that has properties only in `random.*`.
5. OS environment variables.
6. Java System properties (`System.getProperties()`).
7. JNDI attributes from `java:comp/env`.
8. `ServletContext` init parameters.
9. `ServletConfig` init parameters.
10. Properties from `SPRING_APPLICATION_JSON` (inline JSON embedded in an environment variable or system property).
11. Command line arguments.
12. `properties` attribute on your tests. Available on [`@SpringBootTest`](https://docs.spring.io/spring-boot/docs/2.4.4/api/org/springframework/boot/test/context/SpringBootTest.html) and the [test annotations for testing a particular slice of your application](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests).
13. [`@TestPropertySource`](https://docs.spring.io/spring/docs/5.3.5/javadoc-api/org/springframework/test/context/TestPropertySource.html) annotations on your tests.
14. [Devtools global settings properties](https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools-globalsettings) in the `$HOME/.config/spring-boot` directory when devtools is active.