加粗样式# SpringBoot
2021-03-28开始学习springboot,争取一周之内跟着课程学习完毕,随看视频随着记一些笔记,加油吧~
使用springboot直到微服务,云原生等等
文章目录
前言
没什么前言,好好学吧
一、创建springboot项目
1.创建步骤
- 创建maven项目
- 添加pom相关依赖
<parent>
<artifactId>org.springframework.boot</artifactId>
<groupId>spring-boot-starter-parent</groupId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 编写主程序
/**
* 编写主程序类,启动类
* 这是一个springboot应用
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
- 编写业务
@RestController
public class helloController {
/**
* 控制器,专门用来处理请求
* @return
*/
@RequestMapping("/hello")
public String handle01(){
return "hello Boot2";
}
}
-
测试:直接运行main方法
-
简化配置:application.peoperties
-
简化部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
</plugin>
</plugins>
</build>
2.自动配置管理
2.1.SpringBoot特点
2.1.1依赖管理
- 父项目依赖管理
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.4.RELEASE</version>
</parent>
- 开发导入Starter场景启动器:只要引入starter 这个场景所有需要的依赖我们都自动引入
- 无需关注版本号,自动版本仲裁
引入依赖都不用写版本号
引入的非版本仲裁jar要重写配置
- 可以修改版本号:查看dependencies里规定当前依赖的版本;在当前项目里重写配置
2.1.2 优点
- 自动配好tomcat
引入tomcat
配置tomcat - 自动配好springmvc
引入springmvc全套组件
自动配好springmvc常见组件(功能) - 自动配好web常见功能,如字符编码问题
- 默认的包的结构
不需要包扫描(MainApplication在最外层的时候) - 各种配置拥有默认值
映射到MultipartProperties
配置文件的值最终会绑定到每个类上,这个类会在容器中创建对象 - 按需加载所有自动配置项
- …
2.2容器功能
2.2.1 组件添加
1.@Configuration
- 基本使用
- Full模式与Lite模式
示例:
最佳实战(01代码)
配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置 类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用Full模式
2.@Conditional 有条件的注入
3.@ImportResource 支持spring的xml文件导入
2.3 配置绑定
使用java读取到properties并且封装到JavaBean中
- @Componet和@ConfigurationProperties
- @ConfigurationProperties和@EnableConfigurationProperties(类)
3.SpringBoot自动配置原理
3.1 @SpringBootApplication
效果等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
3.1.1 @SpringBootConfiguration
@Configuration
代表当前是一个配置类
3.1.2 @ComponentScan
指定要扫描哪些(基于spring注解)
3.1.3 @EnableAutoConfiguration
是这两个注解的合成
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
1.自动配置包@AutoConfigurationPackage
@Import({Registrar.class}) //利用registrat导入一系列组件,把某一个包下所有组件导入进来(main程序所在的包下)
public @interface AutoConfigurationPackage {}
2.@Import({AutoConfigurationImportSelector.class})
1.利用getAutoConfigurationEntry(annotationMetadata),给容器批量导入一些组件
2.利用List<String> configurations=getCandidateConfigurations(annotationMetadata,attributes)获取到所有需要导入到容器的组件
2.利用工厂加载 Map<String,List<String>> loadSpringFactories(@Nullable Classloader classloader) 得到所有组件
自动配置类文件写死了springboot一启动,就要给容器中加载的所有配置类(127个),但不会全部生效!
3.2 按需配置
@ConditionalOnClass:按需生效,要看该注解
最终按照条件装配规则按需装配
springBoot默认会在底层配好所有的组件,但是如果用户自己配置了以用户自己的优先
总结
- SpringBoot先加载所有的自动配置类
- 每个自动,配置类按照条件进行生效,默认都会绑定配置文件指定的值
- 生效的配置类就会给容器装配很多组件
- 只要容器有这些组件,相当于这些功能就有了
- 定制化组件:
3.3
- 引入场景依赖
- 查看自动配置了哪些
- 是否需要修改
-
参照文档修改配置项 自动义加入或者替换组件
4.开发小技巧
4.1 Lombok
简化javaBean开发
4.2 Spring Initailizr(初始化向导)
4.3 dev-tools
自动更新
二、SpringBoot核心功能
1.配置文件
1.1 文件类型
1.1.1 properties
1.1.2 yaml
1.简介
yam不是一种标记语言,仍是一种标记语言
用来以数据为中心的配置文件
2.基本语法
- key: value (注意空格)
- 大小写敏感
- 缩进表示层级关系
- 只允许空格缩进
- 同级对齐即可
- #表示注释
- ‘’和“”表示字符串内容
3.数据类型
字面量:单个的不可再分 date boolean string number null
k: v
对象:键值对的集合 map hash set object
K: {k1:v1,k2:v2,k3:v3}
k:
k1:v1
k2:v2
k3:v3
数组:一组按次序排列的值
k: [v1,v2,v3]
k:
- v1
- v2
- v3
2.Web开发
2.1 SpringMvc配置概览
2.2简单功能分析
2.2.1.静态资源访问
静态资源目录
类路径:/static /public /resources /META-INF/resources
原理:静态映射
请求进来 先去找Controller看能不能处理。不能的话交给静态资源处理器。静态资源能找到就访问,静态没有就404
静态资源访问前缀
默认无前缀
spring:
mvc:
static-path-pattern: /res/**
resources:
static-locations: [classpath:/haha/]
当前项目+static-path-pattern+静态资源名=静态文件夹下标
webjar
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
访问地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js后面地址按照依赖的包路径
2.2.2 欢迎页支持
- 静态资源路径下 index.html
- controller能处理index请求
2.2.3 自定义Favicon
(这部分调试半天没弄出来,之后再看看)
2.2.4 静态资源原理分析
- SpringBoot启动默认加载 xxxAutoConfiguration类,自动配置类(web开发中加载web配置类)
- SpringMvc自动配置类WebMvcAutoConfiguration,查看是否生效
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
- 查看容器中配置了什么?
- 配置文件的相关属性和什么进行了绑定?
-
WebMvcProperties==springMvc ResourceProperties==spring.resources
- 扩展知识
-
*****一个配置类只有一个有参构造器*****:有参构造器所有的参数的值都会从容器中确定 ResourceProperties 获取和spring.resources绑定的所有值的对象 WebMvcProperties 获取和spring.mvc绑定的所有的值的对象 ListableBeanFactory Spring的bean工厂 HttpMessageConverters 找到所有的HttpMessageConverters ResourceHandlerRegistrationCustomizer找到资源处理器的自定义器
-
*****资源处理的默认规则*****
public void addResourceHandlers(ResourceHandlerRegistry registry) { //resources.add-mapping=false来禁用所有静态资源
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
-
欢迎页的处理规则
2.3 请求参数处理
2.3.1 请求映射
- @xxxMapping
- Rest风格支持 (HTTP请求方式动词来表示对资源的操作)
-
GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户 核心Filter:HiddenHttpMethodFilter 在springboot中手动开启
表单提交rest风格原理
- 表单提交会带上_method=PUT的参数
- 请求过来被filter:HiddenHttpMethodFilter拦截
-
请求是否正常?并求是POST 获取到_method的值 兼容以下请求:PUT;DELETE;PATCH 原生request(post)包装模数requestWrapper重写了getMethod方法,返回的是传入的值 过滤器放行的时候用wrapper 以后调用的getMethod方法是requestWrapper的
Rest使用客户端工具
- 使用postman直接发动put delete请求,无需filter
请求映射原理
(这部分之后再看,目前时间紧急p28)
2.3.2 普通参数与基本注解
- 注解
<li>@PathVariable (路径变量)</li>
<li>@RequestHeader (获取请求头)</li>
<li>@RequestParam (获取请求参数)</li>
<li>@CookieValue (获取cookie值)</li>
<li>@RequestAttribute (获取request域属性)</li>
<li>@RequestBody (获取请求体)</li>
<li>@RequestAttribute(获取request域属性)</li>
<li>@MatrixVariable (矩阵变量)</li>
- Servlet API
- 复杂参数
- 自定义对象参数
2.3.3 POJO封装过程
2.3.4 参数处理原理(p32开始)
- HandlerMapping中找到能处理请求的Handler(Controller.method())
- 为当前handler找一个适配器 HandlerAdapter
2.4 数据响应与内容协商
2.5 视图解析与模块引擎
srpingboot不支持jsp语句
2.5.1 视图解析
2.5.2 模板引擎-Thymeleaf
1.简介
是一个现代化 服务器端的java模板引擎
2.基本语法
- 表达式
表达式名字 | 语法 | 用途 |
---|---|---|
变量取值 | &{…} | 获取请求域,session域,对象等 |
选择变量 | *{…} | 获取上下文对象值 |
消息 | #{…} | 获取国际化等值 |
链接 | @{…} | 生成链接 |
片段表达式 | ~{…} | jsp:include作用,引入公共页面 |
- 字面量
- 文本操作
- 数学运算
- 逻辑运算
- 比较运算
- 条件运算
- 特殊操作
3.设置属性值 th:attr
thymeleaf使用
1.引入Starter
自动配好的策略
- 所有的thymeleaf相关配置都在ThymeleafProperties
- 配置好了springTemplataEngnie
- 配好了ThymeleafViewResolver
- 我们只需要直接开发页面,前缀后缀都指定了
3.核心开发
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${msg}">哈哈</h1>
<h2>
<a href="www.atguigu.com" th:href="${link}">百度</a>
<a href="www.atguigu.com" th:href="@{link}">百度2</a>
</h2>
</body>
</html>
2.5.3 构建后台管理系统
1.项目创建
2.静态资源处理
3.路径构造
4.模板抽取
5.页面跳转
6.数据渲染
2.5.4 视图解析-源码分析(p47)
2.5.5 拦截器机制(源码p49)
2.5.6 文件上传
1.页面表单
2.文件上传代码
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
log.info("上传的信息:email:{},username:{},headerimg:{},photos:{}",
email,username,headerImg.getSize(),photos.length);
if(!headerImg.isEmpty()){
//保存在文件服务器,OSS服务器
String originalFilename = headerImg.getOriginalFilename();
headerImg.transferTo(new File("F:\\code more\\TEST\\"+originalFilename));
}
if(photos.length>0){
for(MultipartFile photo:photos){
if(!photo.isEmpty()){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("F:\\code more\\TEST\\"+originalFilename));
}
}
}
return "main";
}
3.自动配置原理
2.5.7 异常处理
2.5.8 Web原生组件注入
2.5.9 嵌入式servlet容器
2.5.10 定制化原理
1.定制化常见方式
- 修改配置文件
- xxxCustomizer
- 编写自定义的配置类 xxxConfiguration;+@Bean替换,增加组件中的默认组件,视图解析器
- web应用实现WebMvcConfiguration即可定制化web功能
-
@EnableWebMvc+WebMvcConfigurer——@Beanke 可以全面接管SpringMVC,所有规则自己配置
3.数据访问
3.1 Sql
3.1.1 数据源的自动配置
1.导入jdbc场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.49</mysql.version>
</properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.分析自动配置
自动配置的类
- DataSourceAutoConfiguration:数据源的自动配置
- DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置
- JdbcTemplateAutoConfiguration:JdbcTemplate的自动配置,可以来对数据库进行crud
- JndiDataSourceAutoConfiguraion:jndi的自动配置
- XADataSourceAutoConfiguration:分布式事务相关
3.1.2使用Druid数据源
1.druid官方github地址
- 自定义
- 找starter,该配置文件
2.自定义方式
1.创建数据源
//pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
然后进行一系列操作(但是过时不需要啦)
3.1.3 官方Starter进行监控
1.引入druid-starter
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
2.分析自动配置
- 扩展配置项:spring.datasource.druid
- DruidSpringAopConfiguration.class
- DruidStatViewServletConfiguration.class
- DruidWebStatFilterConfiguration.class
- DruidFilter
3.配置实例
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot
username: root
password: ""
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.lyc.boot.*
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filters: stat,wall
filter:
stat:
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
wall:
enabled: true
config:
update-allow: false
3.2 整合MyBatis操作
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
3.2.1 配置模式
- 全局配置文件
- SqlSessionFactory 自动配置好了
- SqlSession 自动配置了SqlSessionTemplate组合了SqlSession
- @import(AutoConfiguredMapperScannerRegistrar.class)
- Mapper
@EnableConfigurationProperties(MyBatisProperties.class);
@AutoConfigureAfter()
配置过程概览
- 配置mybatis规则(全局配置文件 sql映射文件位置)
- 声明Mapper接口(创建Interface),在sql映射文件绑定xml(namespace)
- controller->service->dao->daoImp
- 在yaml中配置全局配置属性
3.2.2 注解模式
- 引入mybatis-starter
- 配置application.yaml 指定mapper-location位置即可
- 编写mapper接口和mapper注解
- 简单方法(注解方式),复杂方法写上配置文件
3.2.3 混合模式
同上