一、基础入门
1.1 初上手SpringBoot的感受
- 更多注解,简化代码;
- 所有的配置都集中在resources中,并且不用像MVC那样繁琐,极度简化配置;可以配置多环境配置文件,然后通过主配置文件的server.servlet.context-path来选择使用哪个配置文件;
- 简化部署,maven直接提供spring-boot-maven-plugin插件,无需别的配置即可打包;
1.2 SpringBoot特点
1、依赖管理
(1)父项目做依赖管理及版本自动仲裁
spring-boot-starter-parent的父项目的父项目中几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制,其可以在pom.xml中的<properties>标签中增加<***.version>修改依赖版本。自动版本仲裁机制可以使引入依赖时不写版本号,只有当引入非版本仲裁的jar或改变版本号时,才要写版本号。
(2)导入starter场景启动器
spring-boot-starter是所有场景启动器最底层的依赖。SpringBoot所有支持的场景包括:Developing with Spring Boot
2、自动配置
(1)自动配置好了Tomcat、SpringMVC、Web常见功能(如字符编码等)
(2)指定默认包结构并支持调整
默认扫描规则:主程序MainApplication.java所在包及其下面的所有子包里面的组件都会被默认扫描进来。如果想要改变扫描路径,可以通过@SpringBootApplication(scanBasePackages="com.atguigu")或者@ComponentScan 指定扫描路径。即日常使用的@SpringBootApplication==等同于==@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan("com.atguigu.boot")
(3)各种配置有默认值
注意:所有默认值都可以在application.properties中再修改且配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
(4)按需加载所有自动配置项
注意:所有默认值都可以在application.properties中再修改且配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
1.2.1 自动配置原理:
(1) SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration——>@Configuration(proxyBeanMethods =)表明该类为配置类
(2) 每个自动配置类按照条件进行生效,不是全部生效——>通过@Conditional设定生效条件
(3) 配置类会绑定配置文件指定的值——> 通过@EnableConfigurationProperties开启绑定功能并注入容器中,@ConfigurationProperties和配置文件的某一项进行绑定
(4) 配置类中@Bean注入组件的部分值从xxxxProperties里面拿,xxxProperties和配置文件进行了绑定
(5) 生效的配置类就会给容器中装配很多组件,只要容器中有这些组件,相当于这些功能就有了——>对配置类中的组件使用@ConditionalOnMissingBean如果用户没有配置好某些组件,SpringBoot会自动加载配置的默认组件,如果用户配置了优先用用户自己配置的
(6)(承接4) 组件定制化配置
○ 用户直接自己@Bean替换底层的组件(不常用)
○ 用户去看这个组件是获取的配置文件什么值就去修改(常用)——>组件当中可能会通过this.properties等绑定配置文件的值,修改配置文件即可修改组件
1.3 容器功能
1.3.1 类组件(bean)添加
在早期使用Spring时,添加bean都是在xml中使用bean标签添加类组件。而对于现在的SpringBoot,可以使用一些注解完成既定功能。首先是Spring中就存在的注解:
Bean注入:
- @Component(代表组件)
- @Controller(代表控制器)
- @Service(代表业务逻辑组件)
- @Repository(代表数据库组件)
指定包扫描路径等规则的注解:
- @ComponentScan("com."):
其他注解:
- @Configuration:告知SpringBoot,这是一个配置类,其有多种模式:
- Full模式:proxyBeanMethods = true时触发,表示外部调用方法每次都是去容器中找组件,对配置类组件进行获取,得到的是CGLIB代理对象,SpringBoot总会检查这个组件是否在容器中存在,如果有就会保证组件单实例;
- Lite模式:proxyBeanMethods = false时触发,表示容器中不会保存代理对象,对配置类组件进行获取,得到的不是代理对象,调用Bean注册方法得到的对象就会新建,不是单实例;
- 使用场景总结:如果只是单单注册组件,无需依赖,则一般均用Lite模式;只有当组件在别的场景会被依赖,则使用Full模式;
- @Bean:给容器中添加组件,以方法名作为组件id(可以在@Bean后自定义组件名),返回类型为组件类型
- 注意:如果@Bean标注的方法传入了对象参数,这个参数的值就会直接从容器中找
- 特性:
- (a)配置类中@Bean注册的组件默认是单实例的,不论在IOC容器中获取多少次,都是同一个组件;
- (b)配置类本身也是组件,即实际注册的组件包括@Configuration注册的配置类以及@Bean注册的方法;
- (c)无论外部对配置类中@Bean注册的方法调用多少次,获取的都是之前注册到容器中的单实例对象;
- @Import:参数为一个Class数组,给容器中自动创建出该数组中类型的组件,默认组件的名字就是全类名
- @Conditional:条件装配,满足Conditional指定的条件,则进行组件注入
1.3.2 原生配置文件引入
- @ImportResource:将已经存在的xml配置进行导入
1.3.3 配置绑定:
1、@Component + @ConfigurationProperties
- 作用:将properties配置文件中的自定义配置,绑定到容器中的实体类中,赋予其实际内容
- 注意:如果要使用该组件需要将组件加到容器中,需要和@Component等注解组合使用
2、@EnableConfigurationProperties + @ConfigurationProperties
- 用法:只EnableConfigurationProperties直接使用在配置类上,@ConfigurationProperties使用在Car.class上
- @EnableConfigurationProperties(Car.class)
- ①开启Car和配置文件的配置绑定功能,让配置文件的赋值赋予Car
- ②把这个Car这个组件自动注册到容器中
3、@Value
- 作用:作用于方法的变量上,使用@Value("${...}")与配置文件的值进行绑定
二、核心功能
2.1 配置文件:
配置文件的撰写主要包括两种,一种是properties,一种的yaml。从yaml开始使用之后,这种规范可以更好地表达配置,更为常用。最主要的撰写规则为:属性写法使用“:”,对象使用{}或错行一个个键值对,数组使用[]或者“-”。
2.2 Web开发
2.2.1 SpringMVC自动配置概览
SpringBoot已经对SpringMVC有自动化配置,大多数场景都无需自定义配置
2.2.2 简单功能分析
1、静态资源访问
(A) 静态资源目录
- 可识别到的静态资源路径包括:/static (or /public or /resources or /META-INF/resources)
- 原理过程:请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
- 修改方式:可通过spring.resources.static-locations=[classpath:/.../]修改默认的静态资源路径
(B) 增加静态资源访问前缀
- 配置方式:spring.mvc.static-path-pattern: /.../**
- 访问路径:当前项目/static-path-pattern/静态资源名
(C) 欢迎页
- 方式一:静态资源路径下有index.html;方式二:能处理index请求的controller
- 注意:方式一在配置静态资源的访问前缀后就不生效了
2.2.3 请求参数处理
1、Rest风格
(1)常用注解形式:@xxxMapping
- 举例:@GetMapping("/a")===@RequestMapping(value="/a",method=RequestMethod.GET)
(2)解读:
- 对增删改查操作使用GET、DELETE、PUT和POST而不是写4个映射路径
(3)使用前端的表单实现:
- 过程:
- (A)表单提交会带上_method=PUT;
- (B)请求过来被HiddenHttpMethodFilter拦截;
- (C)此时会判断是否请求正常,且为POST请求;
- (D)如果正常,则获取到_method的值,兼容PUT.DELETE.PATCH请求
- 原理:
- new HttpMethodRequestWrapper(request, method):将原生request(POST)和method都传入Wrapper中。通过查看源码,此处的requestWrapper还是继承了原生的ServletRequest,并没有修改request,只是采用了包装模式,重写了getMethod()方法,将method的值加入,并返回传入的值。最后过滤器链实际放行了wrapper的值,之后的方法调用getMethod()实际得到的是requestWrapper的已经修改后的值
2、请求映射原理:
SpringBoot将所有的请求映射都放在RequestMappingHandlerMapping中,通过查看源码,其一共有五种HandlerMapping,每次请求到来都从第一种开始挨个尝试,直到找到对应的映射
- 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
- 如果有就找到这个请求对应的handler
- 如果没有就是下一个 HandlerMapping
另:如果因为业务场景需要自定义映射处理,可以自己给容器中放HandlerMapping,自定义 HandlerMapping
3、常用注解、参数
(1)常用注解:
- @RequestParam("xxx"):从请求参数中获取xxx名称的数据赋值给形参
- @PathVariable("xxx"):获取对应路径变量的值
- @RequestHeader("xxx"):获取请求头
- 注意:如果不指定参数名,直接用Map<String,String>来获取,则是取得了所有的值
- @CookieValue("xxx"):获取Cookie的值
- @RequestBody:获取请求体的内容
- @RequestAttribute("xxx"):获取请求域中的属性值
- @MatrixVariable("xxx"):获取矩阵变量,即获取请求中形式为/user/{path;name=wy;age=18}这种以分号分隔的矩阵变量形式的请求数据
(2)Servlet API:
- 种类:WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId
- 用法:在控制器方法的形参使用,可以实现如往请求域中添加数据的功能
(3)复杂参数:
- 种类:Map、Model(map、model里面的数据会被遍历并放在request的请求域,相当于调用了request.setAttribute)、Errors/BindingResult、RedirectAttributes(重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder
(4)自定义类型:
- 数据绑定:页面提交的请求数据(GET、POST)都可以无需set直接和对象属性进行绑定
- 因为SpringMVC提供了参数解析器,每次for循环遍历全部的参数查找能处理该参数的解析器,解析完成后调用WebDataBinder数据绑定器,将请求参数的值绑定到指定的JavaBean中,在此期间还根据数据类型的不同将数据转换数据类型
2.2.4 数据响应和拦截器
1、数据响应
- 常用注解:
- @ResponseBody:SpringMVC注解,使对象作为返回值放于请求体内返回给前端,给类添加意味着给类中所有方法添加,@RestController=@ResponseBody+@Controller
2、拦截器:
- @Configuration:定义配置类-拦截器
- 可替换xml文件;定义一个拦截器,相当于之前的 mvc 里的配置
三、其余内容
3.1 Restful(风格) Web Service
1、说明
- Restful(风格) Web Service是一种通信方式,位于接口层
2、作用
- 其主要作用就是在系统与系统之间,以及在客户端与服务端之间进行信息传递
3、特点
- 无状态:每个请求与之前的任何请求都无关,进行独立事务;
- 独立性:间接代表系统进行了拆分,系统与系统间相互独立,然后使用Restful相互通信。
4、设计规范
- GET方式:获取资源信息,获取资源内容,即查询操作,URL规范:/order/{id}
- POST方式:用于保存、更新资源信息以及处理批量操作,URL规范:/order
- PUT方式:update,更新资源,URL规范:/order/{id};
- DELETE:URL规范:/order/{id}
5、注解:
- @PathVariable:获取 url 中的数据