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




整个流程描述

  1. 从DispatcherServlet开始,doDispatch方法中 先检查上传文件,之后遍历getHandler<这个里面是handlerMappings>拿到的mappedHandler 具体处理请求的那个方法getCar


  1. getHandlerAdapter 处理器适配器,用处理器 HandlerAdapter 来处理 handler(controller中的方法)

如果是 HandlerMethod 方法就可以生效


  1. 执行目标方法

  1. 设置 参数解析器


  1. 对应的还有返回值处理器



真正执行controller中方法的代码

之后获取方法参数值

如何确定目标方法 每一个参数的值


先26个参数解析器支不支持 这个参数的类型 遍历 挨个儿确定

这时已经确定是 这个参数解析器,之后调用这个resolveArgument方法进行解析就行

具体的 匹配出来

1.2、Servlet API:

1.3 复杂参数





如何进行数据绑定

首先是 dispatcherServlet的 doDispatch 函数

之后来到 handlerAdapter

invokeHandlerMethod 真正执行处理器方法

把所有的参数解析器 && 返回值解析器 都保存到里面去,,

mavContainer包含了model和view数据

这个是真正来执行目标方法的invokeAndHandle

invokeForRequest 在这个里面确定参数

这里面有 getMethodArgumentValues 先获取目标方法的 所有参数的值,在doInvoke 执行

获取参数信息,先获取第一个参数的值

看他支不支持这个参数 :

自定义的参数是用 ServletModelAttributeMethodProcessor来解析的


posted @ 2021-05-21 09:35  千面鬼手大人  阅读(241)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css