springboot
@configuration(proxyBeanMethod属性)是不是代理bean的方法,最佳方式为:配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断,配置类组件之间有依赖关系,方法会被调用得到之前实例之间用full模式
@import:在配置了可以被组件扫描类的类上可以加这个注解,用来导入某个对象并调用无参构造器创建对象
@conditional:条件加载对象进容器
@importResource: 导入xml资源文件进容器
@configurationProperties配置绑定:将yml文件里面的数据对象javabean,只有在容器中的组件才可以使用所以要将类加入容器才能使用,enableConfigurationProperties在主程序类上也可以进行属性配置绑定相当于把对象加进容器
@autoConfigurationPackage 直接注解利用registrar方法给容器中注册启动方法类下的一系列组件 @import利用selectImports方法在内部调用getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)方法给容器中批量导入一些组件,而这些组件在List configurations = getCandidateConfigurations(annotationMetadata, attributes);这个方法中进行筛选,该方法使用spring的工厂加载器 SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),层层封装后加载得到所有组件其加载方式为获取META-INF/spring.factories位置来加载一个文件
默认全部加载但按需配置: 注解的作用只有标注,而围绕注解可以进行很多代理方编程,为注解赋予功能 xxxxCustomizer springboot自定义器修改springboot配置的默认行为
springboot默认访问资源路径下的/static /public /resources /META-INF/resources
静态映射原理:请求进来看controller是否能够处理不能则交给静态资源处理
? 匹配任何单字符
** 匹配0或者更多的目录
springMVC功能的自动配置类webMVCAutoConfiguration
html中向springboot无法直接提交put delete请求需要进行嵌套提交,并且开启mvc.hiddenmethod.filter.enable=true,来实现restful风格
<form action="/hello" method="post">
<input type="hidden" name="_method" value="PUT" >
<input type="text" name="username">
<input type="text" name="password">
<input type="submit">
</form>
rest原理:表单提交会带上_method=PUT 请求过来会被HiddenHttpMethodFilter拦截(该方法获取_method的值,并判断七请求是否正常,并且还是POST,原生request(post)包装模式requestWrapper重写了getMethod方法返回的是传入的值,过滤器链放行的时候用wrapper,以后的方法调用getMethod是调用requestWrapper的
springmvc功能的分析都是从servlet.dispatcherServlet里面的doDispatch方法进行
requestMappingHandlerMapping保存了所有@requestMapping和handler的映射规则,所有的请求映射都在handlerMapping中
路径变量里面的值可以通过 @pathVariable map<string,string> 方式全部获取
请求头里面的额所有制可以用@requestHeader map<string,string>方式全部获取
请求参数里面的值可以使用@requestParam map<string,string> 方式全部获取
参数处理原理:handlerMapping中找到能处理请求的Handler(当前handler被封装成了一个HandlerMethod),为当前handler找到一个适配器handlerAdaper(该解析器方法包括的多种例如:requestMappingHandlerAdapter,HandlerFunctionAdapter等),利用适配器将请求传进去,然后执行目标方法,
目标方法执行: mv=ha.handle(processedRequest,response,mappedHandler.getHandler()), 进入到requestMappingHandlerAdapter类中执行方法,在方法执行过程中存在argumentResolvers:参数解析器(目标方法的值是什么是由参数解析器决定的)例如:requestParamMethodArgumentResolver,requestParamMapArgumentResolver等共26种,返回值处理器:有15种,确定支持返回值可以写什么(例如:modelAndView,等)invocableMethod.invokeAndHandle(webRequest,mavContainer)执行并处理
http传输时以文本格式传输,在java后台需要进行解析将string类型的格式转化为javabean
在需要其他格式提交用户信息时重写addFormatters()方法添加自定义格式转换器
/**
* 开启lite模式,通过容器获取bean时将是多例的
*/
@Configuration(proxyBeanMethods = false)
public class WebConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addFormatters(FormatterRegistry registry) {
/**
* 1. 在addFormatters 方法中,增加一个自定义的转换器
* 2. 增加自定义转换器 String -> Car
* 3. 增加的自定义转换器会注册到 converters 容器中
* 4. converters 底层结构是 ConcurrentHashMap 内置有124转换器
*/
registry.addConverter(new Converter<String, Car>() {
@Override
public Car convert(String content) {
if (!ObjectUtils.isEmpty(content)) {
String[] split = content.split(",");
String name = split[0];
double price = Double.parseDouble(split[1]);
return new Car(name, price);
}
return null;
}
});
}
};
}}
返回值处理器:
原理:1.返回值处理器判断是否支持这种类型的返回值supportsReturnType
2.返回值处理器调用handleReturnValue进行处理
3.resquestResponseBodyMethodProcessor可以处理返回值标记了@ResponseBody注解
1.利用messageConverters进行处理将数据转换为json
2.服务器最终根据自己的能力决定服务器能产生什么样内容的数据
3.spingMVC会挨个遍历所有容器的底层的httpMessageConvert看谁能处理
- 得到mappingJackson2HttpMessageConverter可以将对象写为json
- 利用mappingJackson2HttpMessageConverter将对象转化为json再写出去
内容协商:根据客户端接受能力不同,返回不同媒体类型的数据
视图处理原理中,目标方法的处理所有的数据都会被放在ModelAndViewContainer容器中包括数据和视图地址
方法的参数是一个自定义对象也会放在ModelAndViewContainer里面
processDispatchResult()处理派发结果(页面响应如何处理)
forward重定向到页面最原始的操作是response.sendRedirect(url)
拦截器:(handlerInterceptor)
- 根据当前请求找到handlerExecutionChain【可以处理请求的handler以及handler的所有拦截器】
- 先来顺序执行当前拦截器的preHandle方法
1.如果拦截器prehandler返回flase则执行下一个拦截器的preHandle 2.如果当前拦截器返回flase直接倒叙执行所有已经执行了的拦截器的afterCompletion - 如果任何一个拦截器返回flase直接跳出不执行目标方法
- 所有拦截器都返回True执行目标方法
- 倒叙执行所有拦截器的postHandle方法
- 前面的步骤有任何异常都会直接触发afterCompletion
- 页面渲染完成后也会倒叙触发afterCompletion
|