Springboot
Springboot
文档地址: https://www.yuque.com/atguigu/springboot
文档不支持旧版本IE、Edge浏览器,请使用chrome或者firefox
视频地址: http://www.gulixueyuan.com/ https://www.bilibili.com/video/BV19K4y1L7MT?p=1
源码地址:https://gitee.com/leifengyang/springboot2
基础入门--Hello World
首先,创建maven工程,并引入对应的依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
接着,创建一个spirngboot的主程序:
/** * 主程序类 * @SpringBootapplication 这是一个SpirngBoot应用 */ @SpringBootapplication public class Mainapplication { public static void main(String[] args) { Springapplication.run(Mainapplication.class,args); } }
接着创建controller层。
在springBoot中,有controller和Responbody的复合注解:RestController
然后只需要在spirngboot的主程序中启动,即可在浏览器中打开;
配置文件
配置中都是能抽取出来为全局使用的
自动配置
ConfigurableapplicationContext run = Springapplication.run(Mainapplication.class, args);
主程序类中,返回的是一个包含很多的IOC容器。
默认的包结构:
主程序所在包及其下面的所有子包里面的组件都会被默认扫描。
想要改变扫描路径,@SpringBootapplication(scanBasePackages="com.atguigu")
或者@ComponentScan 指定扫描路径
容器功能
--Spring中注册了一个组件交给容器管理后,而在容器中,这是单实例的,不管获取多少次,都还是这个组件。
使用注解代替xml来注册组件。
1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的。
2、配置类本身也是组件
3、如果@Configuration(proxyBeanMethods = true) 代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。如果有,就不会新创,保证单实例。如果是false,那么就会变成多实例了。
外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器的单实例对象。
组件依赖:比如用户养的宠物,如果是true,那么从用户中取出宠物的class和从容器中取出宠物的class是相同的。
调成false的优势:Spring就不会检查是否会有这个代理对象,跳过了检查,启动就会非常快。
Full模式与Lite模式
示例
最佳实战
配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
4、@Import注解
* 4、@Import({User.class, DBHelper.class}) * 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名 * * * */ @Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件 public class MyConfig { }
@Conditional
条件装配
配置绑定
springIOC管理,当bean加入了容器交给了Spirng管理的时候,就能在配置文件中,直接去修改这个组件的某个属性的值。
属性绑定:@ConfigurationProperties(prefix="xxx")
@EnableConfigurationProperties(car.class):
1、开启car配置绑定功能
2、把这个car组件自动注册到容器中
场景问题:当引用第三方包时,不能在其bean上标注@component,但可以使用@EnableConfigurationProperties
SpirngBoot默认会在底层配好所有的组件,但是如果用户自己配置了以用户的优先
总结
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
最佳实践
开发小技巧
Lombok
get、set、toString方法:@Date
全参构造器:@AllArgsConstructor
无参构造器:@NoArgsConstructor
Hashcode:@EqualsAndHashCode
日志属性添加:@Slf4j :
直接可以在对应的地方加上: log.info("xxx");
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> idea中搜索安装lombok插件
dev-tools
项目或者页面修改以后:Ctrl+F9;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
Spring Initailizr(项目初始化向导)
核心功能篇
配置文件
yaml
1.2.2、基本语法
key: value;kv之间有空格
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释
字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义
双引号不会转义,单引号会转义
Web开发
2、简单功能分析
2.1、静态资源访问
1、静态资源目录
只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources
访问 : 当前项目根路径/ + 静态资源名
原理: 静态映射/**。
请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
改变默认的静态资源路径
spring: mvc: static-path-pattern: /res/** resources: static-locations: [classpath:/haha/]
2、静态资源访问前缀
默认无前缀
spring: mvc: static-path-pattern: /res/**
当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找
3、webjar
自动映射 /webjars/**
https://www.webjars.org/
<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、欢迎页支持
静态资源路径下 index.html
可以配置静态资源路径
但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
spring: # mvc: # static-path-pattern: /res/** 这个会导致welcome page功能失效 resources: static-locations: [classpath:/haha/]
controller能处理/index
2.3、自定义 Favicon
favicon.ico 放在静态资源目录下即可。
spring: # mvc: # static-path-pattern: /res/** 这个会导致 Favicon 功能失效
如果一个配置类只有一个有参构造器,那么其所有属性的值,都会默认从容器中找。
小记:@responseBody 是将后端返回的数据封装成json串
矩阵变量,分号的形式:
/cars/sell;low=34;brand=byd/xxx;xx=xx
自定义convert:相当于在配置类中进行方法的重写
3、开启浏览器参数方式内容协商功能
为了方便内容协商,开启基于请求参数的内容协商功能。
spring: contentnegotiation: favor-parameter: true #开启请求参数内容协商模式
发请求: http://localhost:8080/test/person?format=json
http://localhost:8080/test/person?format=xml
format后面带上具体想要的方式
视图解析 渲染
使用模板引擎渲染:
表单发送(转发重定向),刷新仍停留上一次发送的请求(表单的post),但是不能直接重定向,因为非静态资源,模板引擎templates文件夹下所有的页面都需要经过请求处理(controller),最后由模板的渲染。
要被thymeleaf解析,每一个html都要加上thymeleaf的名称空间。
文件上传
异常处理
导入的服务器只能有一个,不然会报错。
数据访问
maven的最短路径原则 通过最短路径,最佳匹配来直接修改mysql驱动版本
自定义datasource版本时,可以通过@Bean方式添加组件,返回一个Datasource,同时,可以绑定配置文件:
@ConfigurationProperties("")
单元测试
Junit5
springboot整合了Junit5的功能,junit类具有Spring的功能,@Autowire,比如@Transactional标注测试方法,测试完成后自动回滚;
特性
@EnableConfigurationProperties(xxx.class) 将对应类和配置文件绑定并且自动放到容器中