Boot
SpringBoot
1、Hello world
pom文件(自动配置)
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.5.5
com.example
Helloboot_Test
0.0.1-SNAPSHOT
Helloboot_Test
Demo project for Spring Boot
<java.version>1.8</java.version>
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
//方便简化部署的插件 可以将项目打成jar包直接在目标服务器上执行
org.springframework.boot
spring-boot-maven-plugin
主程序
package com.example.helloboot_test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HellobootTestApplication {
public static void main(String[] args) {
SpringApplication.run(HellobootTestApplication.class, args);
}
}
编辑业务
package com.example.helloboot_test;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloBoot {
@RequestMapping(“/hello”)
public String heboot(){
return “Hello Springboot!”;
}
}
配置文件(application.properties)
运行结果
2、SpringBoot依赖管理(使用父项目实现依赖管理)
pom文件的父项目
pom文件的父项目的父项目(负责管理所有依赖的版本号)
![67676eceb8a35775ad4e2226b2fb138c.png][67676eceb8a35775ad4e2226b2fb138c]
3、starter场景启动器
![500681baf291743df254382e674ec468.png][500681baf291743df254382e674ec468]
官方场景启动器格式 : spring-boot-starter-* *就对应一种场景
形如 *-spring-boot- starter 为第三方提供的场景启动器
![b602a954176fc65914990a4516da7325.png][b602a954176fc65914990a4516da7325]
3、SpringBoot自动配置
在生成SpringBoot项目后,springboot会自动将引入的依赖进行配置(例如:tomcat 、springmvc 等)并且需要配置的配置项都会有一个默认值且默认配置的值最终都会映射到某个类上,并且配置文件中的属性配置也会绑定在某个类中 这个类会在容器中创建出对象以方便获取配置。
SpringBoot会在启动时引入对所有场景的自动配置类,但是只有引入依赖的场景(有对应的jar包)才会生效(得益于 @Conditional 注解的存在)
所有的自动配置功能都在spring-boot-autoconfigure-2.5.5.jar包中
4、springboot组件添加
Spring中的@Component、@Controller、@Service、@Repository也可以向容器中添加组件详情看spring笔记
1)@Configuration注释
实体类
package com.example.helloboot_test.Entity;
public class car {
private String name;
private String price;
public car() {
}
public car(String name, String price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = package com.example.helloboot_test.Entity;
public class car {
private String name;
private String price;
public car() {
}
public car(String name, String price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
配置类
package com.example.helloboot_test.Config;
import com.example.helloboot_test.Entity.car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HelloConfig {
@Bean//如果不设置那么容器中对象的名字就是类名
public car Car(){
return new car(“BYD”,“1000000”);
}
}
测试(在main方法中进行测试)
ConfigurableApplicationContext run = SpringApplication.run(HellobootTestApplication.class, args);
//=获得所有容器中的组件名字并遍历================================
// String[] beanDefinitionNames = run.getBeanDefinitionNames();
// for (String a: beanDefinitionNames
// ) {
// System.out.println(a);
// }
结果
![51c8642498dde6097a0db4f9d9737b27.png][51c8642498dde6097a0db4f9d9737b27]
注:@Bean注释注册的组件默认是单实例对象
![98365bdea7e81a4516a3921928b93c81.png][98365bdea7e81a4516a3921928b93c81]
Lite模式与Full模式
Lite模式会使得配置类注册对象的方法如果被反复调用将会创建出不同的对象(如果容器中的两个组件存在依赖关系则不建议使用Lite模式,会导致被依赖的对象不在容器中)(Lite模式会使得容器的启动速度加快)
Full模式为默认情况下的模式配置类只能创建出单实例对象(如果容器中的两个组件存在依赖关系则建议使用Full模式)
Lite模式(Full为默认模式将不做演示)
![3e3bcbec975b471a544e43f4b1c947c1.png][3e3bcbec975b471a544e43f4b1c947c1]
![3c58d96fc150163fd19ed91985f9625f.png][3c58d96fc150163fd19ed91985f9625f]
5、@ComponentScan 注释、
该注释和在Spring中一样用于设置包扫描路径
在SpringBoot中主程序的注释@SpringBootApplication包含了@ComponentScan注释
![8c5b4841207d016292d7d008d031daea.png][8c5b4841207d016292d7d008d031daea]
所以以下情况效果一样
包路径关系
![12711d7b4cab06228e99cdca703965cd.png][12711d7b4cab06228e99cdca703965cd]
情况一:
![66ea81e58159bc05cacb5e599378fd94.png][66ea81e58159bc05cacb5e599378fd94]①可以访问,②无法访问
情况二:
![242604b3b92250a07ec1d4da1c127acf.png][242604b3b92250a07ec1d4da1c127acf]覆盖@SpringBootApplication中的默认扫描路径
情况三
![1613551117c3535512d2fb40f06bb298.png][1613551117c3535512d2fb40f06bb298]相当于将@SpringBootApplication拆分并重新设置包扫描路径
6、@Import注释
![ef0d66ef52d02d1f0350cb921d1c69f8.png][ef0d66ef52d02d1f0350cb921d1c69f8]
该注释可以将数组中的类性创建对象并注册到容器中(若容器中已经存在了这种类型的对象就不会在注册了(Lite模式会))
7、@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
![f1d9ae8f0a53d3b8db5a6d84e7b68a33.png][f1d9ae8f0a53d3b8db5a6d84e7b68a33]
8、@ImportResource 原生配置文件引入
![bb8a4f035ff818125fd42b7e5b9ce9ab.png][bb8a4f035ff818125fd42b7e5b9ce9ab]
配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd”>
测试结果
System.out.println(run.getBean(“user01”));
![8d7d8fb52209e65ca0eba5b6257e98f4.png][8d7d8fb52209e65ca0eba5b6257e98f4]
8、配置绑定
使用java读取到properties文件中的配置信息并绑定到对应的属性上
1、@Component+@ConfigurationProperties
![f6c42c5f536c154df21d547d961d30de.png][f6c42c5f536c154df21d547d961d30de]
配置文件
![a071fa085639a2e809a51fd09bdc0f36.png][a071fa085639a2e809a51fd09bdc0f36]
2、@EnableConfigurationProperties+@ConfigurationProperties
![a5ec0e6cd7f82730ccebf0ed50411a3f.png][a5ec0e6cd7f82730ccebf0ed50411a3f]
![3eeffd0d231d674918891400f254b165.png][3eeffd0d231d674918891400f254b165]
9、自动配置
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties
10、配置文件
yaml
是一种非常适合用来做以数据为中心的配置文件
在SpringBoot中(application.yaml)可以代替application.properties使用,如果根目录中同时出现了这两个配置文件则会同时使用两个配置文件中不重复的部分 重复的部分优先使用application.properties
yaml的基本语法
KEY: VALUE(注:冒号和value之间有空格的存在)
大小写敏感
使用缩进表示层级关系
空格的数量并不重要,重要的是相同层级的元素必须要对齐
原则上不能使用Tab代替空格
#号代表注释
字符串不需要加引号 加单引号:表示单引号内的字符会被转义 eg:输入:‘张三 \n 李四’ 输出:张三
李四
加双引号:表示双引号内的字符不会被转义 eg:输入:“张三 \n 李四” 输出:张三\n李四
yaml配置不同的数据类型
对象: 键值对集合,map,set,list,queue
行内写法: k: {k1,v1,k2,v2…}
or
k:
k1: v1
k2: v2
.
.
数组
行内写法 k: [v1,v2,v3]
or
k:
- v1
- v2
- v3
11、WEB
1)静态文件的调用
“classpath:/META-INF/resources/”,
“classpath:/resources/”,
“classpath:/static/”,
“classpath:/public/”
在上面四个路径下的静态文件可以被访问到
![7a22c661843f8f6842318a92304c6d67.png][7a22c661843f8f6842318a92304c6d67]
原理:静态映射/**
收到请求,先去对比controller看能不能处理,不能处理则交给静态资源处理器,再不行则返回404
2)添加静态资源访问前缀(作用:当需要使用过滤器拦截访问时,可以排除掉所有的静态资源文件)
![baf7965482196dc038f5cc8a737d1bd2.png][baf7965482196dc038f5cc8a737d1bd2]
![14c366296a5e08aea37802bfc7a8f306.png][14c366296a5e08aea37802bfc7a8f306]
3)欢迎页的配置 : 静态资源路径下 index.html
注:配置类静态资源文件前缀会导致无法访问欢迎页(原因是springboot底层代码已经把欢迎页配置文件写死为“/** ”)
4)Rest 风格的使用与原理
eg: 增删改查restt
以前发送同一个对象的不同操作的请求
/addRestt 增加restt /deleteRestt 删除restt /updateRestt 修改restt /searchRestt 查找restt
以Rest风格发送同一个对象的不同操作的请求
/restt method=get(增加restt ) /resrr method=delete (删除restt) /restt method=put (修改restt) /restt method=post (查找restt)
Rest风格就是以相同的请求名 的不同请求方式去操作资源(对象)
实现:
①开启页面表单的rest功能
![1ecefdecc55d5eb1a9d8d4b28d9089bc.png][1ecefdecc55d5eb1a9d8d4b28d9089bc]
②将表单method=post 再在form表单中添加以个隐藏域 name= _method value=“真正想要使用的请求方式(put,delete。。。)”
![ab5f12533316a8a5b7860adb6b82fd18.png][ab5f12533316a8a5b7860adb6b82fd18]
③编写逻辑层代码
![586ccf6db0540a0146f0cb0aa75db466.png][586ccf6db0540a0146f0cb0aa75db466]
原理:
表单提交数据会带上 _method=PUT
请求到达后会被HiddenHttpMethodFilter拦截
若请求正常且 是post方式
就会获取 _method的值,并对原生的request(post)
进行包装 成为requestWapper(wapper也是继承HttpRequest 只不过重写了getMethod方法 返回的是_method传入的值)
过滤器链放行时时使用的wapper作为请求协议包所以以后调用的getmethod()方法的到的都是_method的值
注:只有表单提交请求才会包装request生成wapper 客户端等方式发送请求本身就可以发送get和put以外的请求
5)请求映射原理
所有的请求映射都在 HandlerMaping中
springboot会自动配置欢迎页面的WelcomPageHandlerMapping。使得能访问到欢迎页
springboot自动配置了Request HandlerMapping
请求进来会尝试对比所有的HandlerMapping看是否有请求信息
6)请求参数以及基本注解
①参数:
Servlet API:WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、 TimeZone、ZoneId
复杂参数:Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、 ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder
自定义对象参数:springmvc会将传入的数据自动封装成自定义的对象
![af19f3998b5ff4037e48ade3a0e7028e.png][af19f3998b5ff4037e48ade3a0e7028e]![74b8defe49985af95d8b7ccb96311fa5.png][74b8defe49985af95d8b7ccb96311fa5]
![1cdce2f184eba536722b56cc8d5434a1.png][1cdce2f184eba536722b56cc8d5434a1]
结果:
![f969a32b52cb9f65002ff09417910561.png][f969a32b52cb9f65002ff09417910561]------------------------------------》![f989644c0948e68083e0daaf40109c14.png][f989644c0948e68083e0daaf40109c14]
②注解
@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue(获取Cookie值)、@RequestBody(获取请求体)
@RequestAttribute(获取请求作用域中的值)
@PathVariable:从路径变量中获取属性值
![1de116e07c7768497dfea27ca2dd4394.png][1de116e07c7768497dfea27ca2dd4394]
![ef4bb0c3afdf2832b91c9db24a5e00c6.png][ef4bb0c3afdf2832b91c9db24a5e00c6]
@RequestHeader:获取请求头信息
![b5b48eee53dbde7fb4771365fb63ca8c.png][b5b48eee53dbde7fb4771365fb63ca8c]
![1cf68b5c2518b605a890662e15dba799.png][1cf68b5c2518b605a890662e15dba799]
@RequestParam:获取请求参数
![da0967e47af4b2120353692d575cb260.png][da0967e47af4b2120353692d575cb260]
![83692e3b70867baedeef7ca76d266abb.png][83692e3b70867baedeef7ca76d266abb]
@MatrixVariable 矩阵变量 (SpringBoot默认关闭,需要自己开启)当网站禁用Cookie时可以使用矩阵变量来访问Session
7)数据响应于响应内容协商
![56a438cfa496fd9f67176994ced53a85.png][56a438cfa496fd9f67176994ced53a85]
①响应JSON
SpringBoot中引入web后会自动引入,响应json场景
![45742c528bc59c711fb7272dc3cf403c.png][45742c528bc59c711fb7272dc3cf403c]
所以当在Controller上添加@ResponseBody注解时会直接以json的形式写入到响应体中(SpringBoot中@RestController 包含了@Controller和@ResponseBody)
②内容协商
浏览器会默认以请求头的形式告诉服务器它能接受什么类型的请求,服务器则会根据自己的能力来决定返回什么样内容类型的数据
![0cc429cb967cb53eb6076bbec2115248.png][0cc429cb967cb53eb6076bbec2115248]
由上图可知浏览器默认会优先接受xml,所以当我们为项目中添加了响应xml的场景是就会出现如下情景
![9dba24ab9e96a92e58df8e340d1c757a.png][9dba24ab9e96a92e58df8e340d1c757a] 添加的xml依赖
代码并没有改变
![d71738491bd98116eebe2c5de968c17d.png][d71738491bd98116eebe2c5de968c17d]
***开启请求参数内容协商模式
![d726b2b59a1584050c970777c91c9815.png][d726b2b59a1584050c970777c91c9815]
![7b0b576db7f2b8592f808fc98d0ea00b.png][7b0b576db7f2b8592f808fc98d0ea00b]会根据浏览器传入参数format的值接受对应的类型
![04e4293de3d05f6b79448031e01a9297.png][04e4293de3d05f6b79448031e01a9297]
8)试图解析于模板引擎
①试图解析: springboot中默认将web工程打包为jar包 ,单是jar包器是相当于十一个压缩包,而jsp文件并不支持在压缩包中解析,所以springboot并不支持使用jsp作为模板引擎 。
②模板引擎 Thymeleaf
在springbootThymeleaf自动配置文件中已将将返回的页面自动配置了前缀与后缀,所以返回的时候不必自己再一次添加
![c1cfa7cbe57f30e80b9b15de89a78253.png][c1cfa7cbe57f30e80b9b15de89a78253]
Ⅰ、基本语法
![498db614a82397f54395bf8beeeeca61.png][498db614a82397f54395bf8beeeeca61]
Ⅱ、字面量
文本值:‘xxxxx’
数字: 0,12,123
布尔值: true false
Ⅲ、文本操作
字符串拼接: +
变量替换: |The name is ${name}|
Ⅳ、数学运算
+,-,*,/,%
Ⅴ、布尔运算
运算符: and or
一元运算: !,not
Ⅵ、比较运算
比较: > , < , >= , <= ( gt , lt , ge , le )等式: == , != ( eq , ne )
Ⅶ、条件运算
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
![e68368e6e0b21bf52affdfd232985f3a.png][e68368e6e0b21bf52affdfd232985f3a]
![06e92e81b92000a634c6d00867ba595f.png][06e92e81b92000a634c6d00867ba595f]
![d901664e6393ef240fc1fa7f381ce8e6.png][d901664e6393ef240fc1fa7f381ce8e6]
行内写法:![7d5ad16d80792ae86dd88a32fb4b0127.png][7d5ad16d80792ae86dd88a32fb4b0127]
Ⅶ、抽取公共页面
公共页:th:fragment=“xxx” / id=“xxx”(使用选择器)
![4f21b91a6f2993cfcfd925307928c468.png][4f21b91a6f2993cfcfd925307928c468]
![7091409a78447acabb5657e8d428d2bb.png][7091409a78447acabb5657e8d428d2bb]使用选择器
插入页 th:insert=“公共页::名字/#+id” / th:replace=“公共页::名字/#+id” / th:include=“公共页::名字/#+id”
![12135a1e5541ef2859bb1552c29d35eb.png][12135a1e5541ef2859bb1552c29d35eb]
![36e960f5ed1aeecf88d267ca203c6350.png][36e960f5ed1aeecf88d267ca203c6350]使用选择器
9)过滤器
过滤器实现类
![0e7e654ac281c67d633e432730b2174a.png][0e7e654ac281c67d633e432730b2174a]
配置类(将过滤器进行添加并使用)
![1cf0db33640f6e43572f4636b70e9db2.png][1cf0db33640f6e43572f4636b70e9db2]
作用:进行登录验证
10)文件上传
![e040ae05eacc62c8c729c479135e9dd1.png][e040ae05eacc62c8c729c479135e9dd1]
![6b6aa631d33e6cf8714f7acff66be3ba.png][6b6aa631d33e6cf8714f7acff66be3ba]
12、数据访问
SpringBoot导入JDBC场景后是不导入,数据库依赖的,因为并不知道需要使用的是那种数据库,但是会为全部类型的数据库创建版本仲裁
1)JDBCTemplate
数据库基本信息的配置
![050eb8eb934554add5260939239ea980.png][050eb8eb934554add5260939239ea980]
使用
![23b3e2ab5ef7f77c0ff7541715f58763.png][23b3e2ab5ef7f77c0ff7541715f58763]
2)更改数据源(连接池)
SpringBoot 自动配置是如果容器中没有用户自己添加的DataSource(连接池)就会为用户自动创建一个连接池(HiKari连接池),并且会自动的配置好JDBCTemplate然后放入到容器中让用户使用。所以只需要自己创建好连接池对象springBoot就会使用我们自定义的连接池对象配置JDBCTemplate
①不引入Durid连接池场景配置
引入依赖
![78689d6cc66254e35b271160ba1e23c9.png][78689d6cc66254e35b271160ba1e23c9]
创建配置类
![67f2c0b9468129d98c4ace289a6858ed.png][67f2c0b9468129d98c4ace289a6858ed]
测试
![fb43f32cc0dabc1d4f76ec168e5e7051.png][fb43f32cc0dabc1d4f76ec168e5e7051]
②引入Durid第三方的场景
![3049e8b10e3917c4cbf0956a1384437b.png][3049e8b10e3917c4cbf0956a1384437b]
该注解表示Druid会在SpringBoot配置连接池之前将连接池配置完成并放入容器![1e1b6f3bfb1a6f53d9087465fa403d2f.png][1e1b6f3bfb1a6f53d9087465fa403d2f]
配置页
![614adf6fa100a30d4700dfbac0a166ca.png][614adf6fa100a30d4700dfbac0a166ca]
使用与不注入场景时一样
3)整合Mybatis
自动配置
引入Mybatis场景后会自动配置好
- 全局配置文件
- SqlSessionFactory: 自动配置好了
- SqlSession:自动配置了 SqlSessionTemplate 组合了SqlSession
- @Import(AutoConfiguredMapperScannerRegistrar.class);
- Mapper: 只要我们写的操作MyBatis的接口标准了 @Mapper 就会被自动扫描进来
①配置文件模式
Mapper接口
![cc1512259f90fbebf7a3f58c1e6ee0a7.png][cc1512259f90fbebf7a3f58c1e6ee0a7]
mapper映射文件
![8a5e14b72bb4467e9529846ca3783cac.png][8a5e14b72bb4467e9529846ca3783cac]
映射文件路径设置
![89e5c7e2cf3d10b5900e0eef319bd032.png][89e5c7e2cf3d10b5900e0eef319bd032]
②注解模式
![0ade93ba572d99ebefbf5a49b8a048ab.png][0ade93ba572d99ebefbf5a49b8a048ab]
注解模式无需对应mapper映射,而且可以和非注解模式混合使用,一般而言复杂的sql写在配置文件中,而简单的就直接使用注解模式
4)整合Mybatis—Plus
优点:不用自己写sql,只需要给mapper接口继承BaseMapper就可以进行CRUD
Mapper接口
![5dac20525d6d2f6637df74bf03a42746.png][5dac20525d6d2f6637df74bf03a42746]
Service接口
![4174d053892cfc244849f2c5cc354db6.png][4174d053892cfc244849f2c5cc354db6]
Service实现类
![629530715870aa46eb7d1b0f722cc7a1.png][629530715870aa46eb7d1b0f722cc7a1]
功能实现
分页查询数据库中的数
Controller
![c6279767d2869b9844da23ef85a0e2bc.png][c6279767d2869b9844da23ef85a0e2bc]
要实现分页功能所必要的配置(添加拦截器)
![c65cdc03a2b6564d0b9ba7842d6b00f4.png][c65cdc03a2b6564d0b9ba7842d6b00f4]
使用Thymeleaf对前端页面进行渲染
![79062fc37fbaebc2d2a38fa54cdfbb40.png][79062fc37fbaebc2d2a38fa54cdfbb40]
效果
![be6158388bf7941e6c9ff81453093cdb.png][be6158388bf7941e6c9ff81453093cdb]