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来解析的




浙公网安备 33010602011771号