spring boot 2
内嵌容器原理
内嵌容器--Tomcat
Tomcat.exe 运行java main
把servlet 注册到tomcat:
spring-boot-start-web
spring boot 把springMVC要做的 xml的配置DispatcherSevlet 字符乱码CharaterEncodingFliter ViewResolver视图解析器,文件上传解析器 那些。。。都不用配置了
而且只要是 主程序在的这个目录下所有的子包,都是可以自动扫描到的。
以往都要
现在是:
测试:
因为是代理对象
条件装备 @ConditionalOnBean(name = "") @ConditionalOnMissingBean(name = "")
如果xml配置了已经,可以 @ImportResource("classpath:beans.xml")
配置绑定
方法1:@Component + @ConfigurationProperties
方法2:@EnableConfigurationProperties在配置类中 + @ConfigurationProperties
自动配置的原理
防止有些用户配置的文件上传解析器不符合规范
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
给容器中加入了文件上传解析器;
响应式编程
java8 接口的默认实现,不用适配器adapter,可以直接默认实现。
@SpringBootApplication
SpringAppliction.run(M类.class, args);
@Controller
@ResquestMapping()
@ResponseBody 要以字符串的方式返回给浏览器,,,如果都 就放在类上,
@RestController = 替换了@Controller+@ResponseBody 放在类上,
自定义修改版本
lombok
lombok getset pom + plugins安装
@Data @ToString @EqualsAndHashCode @ Slf4j @NoArgsContructor @AllArgsContructor
log.info("")
热更新 devtools ctrl+f9自动重启
restart 热更新 jrebel是付费的
Spring initializer
yaml yml
以前的
现在是
配置提示:
boot 帮MVC 做了
静态资源访问
静态资源的禁止 和 调用流程:
禁止是isAddMappings() == false,,直接就禁止了
调用流程:
resourceProperties.getCache() /webjars/**下的所有请求都定位到 /META-INF/resources/webjars/下面找
HandlerMapping
RequestMapping 请求映射
Rest 风格
但是这个是 不能处理 delete和put 请求的,所以需要配置 HiddenHttpMethodFilter
只要有_method 还可以自己改
默认是不开启的,所以需要自己写配置文件开启
Rest 原理 表单提交
包装模式的requestWrapper
Rest 原理 使用客户端工具 postman
请求映射原理
所有的请求都会去到 DispatcherServlet,处理所有请求的开始
具体的:
怎么找到当前请求 要找到的controller来处理
handlerMappings 处理器映射的保存地
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则。
同样的一个 请求方式,只能有一个匹配,不然会报错
普通参数与基本注解
1.1、注解:
@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody
model里面的数据就会放到request 的请求域中
测试 @PathVariable
获取请求头:
cookie
请求体 RequestBody
RequestAttribute 获取request域属性
jssessionid 存在 cookie中,如果cookie被禁用了,就找不到jsessionid,如何找到session里面的东西
使用url重写,把cookie的值用矩阵变量进行传递。
默认是禁用的
想要自定义 有三种方案
UrlPathHelper
整个流程描述
- 从DispatcherServlet开始,doDispatch方法中 先检查上传文件,之后遍历getHandler<这个里面是handlerMappings>拿到的mappedHandler 具体处理请求的那个方法getCar
- getHandlerAdapter 处理器适配器,用处理器 HandlerAdapter 来处理 handler(controller中的方法)
如果是 HandlerMethod 方法就可以生效
- 执行目标方法
- 设置 参数解析器
- 对应的还有返回值处理器
真正执行controller中方法的代码
之后获取方法参数值
如何确定目标方法 每一个参数的值
先26个参数解析器支不支持 这个参数的类型 遍历 挨个儿确定
这时已经确定是 这个参数解析器,之后调用这个resolveArgument方法进行解析就行
具体的 匹配出来
1.2、Servlet API:
1.3 复杂参数
如何进行数据绑定
首先是 dispatcherServlet的 doDispatch 函数
之后来到 handlerAdapter
invokeHandlerMethod 真正执行处理器方法
把所有的参数解析器 && 返回值解析器 都保存到里面去,,
mavContainer包含了model和view数据
这个是真正来执行目标方法的invokeAndHandle
invokeForRequest 在这个里面确定参数
这里面有 getMethodArgumentValues 先获取目标方法的 所有参数的值,在doInvoke 执行
获取参数信息,先获取第一个参数的值
看他支不支持这个参数 :
自定义的参数是用 ServletModelAttributeMethodProcessor来解析的