当前位置: 首页 > news >正文

网站海外推广哪家好做昆虫类论文网站

网站海外推广哪家好,做昆虫类论文网站,晋城市住房城乡建设局网站,中国互联网网站性能文章目录 前言正文一、设计原理1.1 servlet生命周期简述1.2 设计原理小结 二、启动原理2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析2.2 DispatcherServlet 的初始化2.3 DispatcherServlet#initHandlerMappings(...) 初始化示例说明 三、工作原理 前言 … 文章目录 前言正文一、设计原理1.1 servlet生命周期简述1.2 设计原理小结 二、启动原理2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析2.2 DispatcherServlet 的初始化2.3 DispatcherServlet#initHandlerMappings(...) 初始化示例说明 三、工作原理 前言 本系列文章基本环境如下 java8springboot2.7 创建项目使用阿里的源https://start.aliyun.com 创建前请先设置好自己的maven环境java版本。保持网络正常。 选择spring-web的2.7.6 版本 使用阿里的源创建好项目后会自动生成的有控制器Controller启动类以及一个页面。 如此准备工作就做好了。 正文 在Java还没有SpringMvc时使用的是servlet jsp 的方式对外提供接口以及和页面进行数据交互等操作。 但是这种操作毕竟还是不方便功能也不够强大。 曾经的写法需要配置xml文件如果页面够多光配置就是一大堆。 发展到后来servlet3.0的时候出现了完全注解版的写法。 关于servlet的描述这里不做过多解释本文将对对springmvc中使用到的servlet特征进行阐述继而分析它的设计原理springmvc启动原理以及工作原理 等到在Spring框架中的时候就已经是DispatcherServlet了。 而它本身就是一个servlet其类关系图如下 一、设计原理 1.1 servlet生命周期简述 Servlet生命周期分为三个阶段 初始化阶段调用init()方法实现初始化工作。运行阶段处理请求容器创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象并将它们作为参数传递给Servlet的service()方法。销毁阶段Servlet将被销毁生命周期结束。 Servlet本身只是一个接口在HttpServlet实现类中对service()方法进行了实现。 而这里的实现是套用了模版方法设计模式将service的职责拆分了按照请求方法的类型不同划分。 比如如果请求方法是 GET请求则会执行到 HttpServlet的 doGet方法如果是POST请求则会执行到 HttpServlet的 doPost方法。 FrameworkServlet 又对HttpServlet中的service方法进行了重写 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpMethod httpMethod HttpMethod.resolve(request.getMethod());if (httpMethod ! HttpMethod.PATCH httpMethod ! null) {super.service(request, response);} else {this.processRequest(request, response);}}这里判断了请求方法默认执行 HttpServlet的 service方法。 但是实际调用的是 doGetdoPost这类方法。而同时这类方法也被FrameworkServlet重写了 也就是说servlet 会触发执行到 FrameworkServlet 的 processRequest 方法。如下图所示 这里会执行FrameworkServlet 的 doService方法。而这是一个抽象方法。其子类DispatcherServlet 对其进行了实现。如此便贯通了。 1.2 设计原理小结 在1.1小节中的分析中Servlet继承实现的关系如下 也就是说在servlet处理请求时对于springmvc而言就是执行 doService方法。 二、启动原理 这一小节主要分析SpringBoot项目启动时对SpringMvc部分的处理。 2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析 谈起SpringMvc最先想起来的俩注解应该是 Controller 和 RequestMapping。 而关于启动项目时框架对这俩注解的处理基本都体现在AbstractHandlerMethodMapping中。 public abstract class AbstractHandlerMethodMappingT extends AbstractHandlerMapping implements InitializingBean {// ...省略其他方法public void afterPropertiesSet() {this.initHandlerMethods();} }首先AbstractHandlerMethodMapping是个抽象类它的子类会放到Spring容器中。 而在它的子类 RequestMappingHandlerMapping 中对初始化方法进行了重写具体内容如下 public void afterPropertiesSet() {this.config new RequestMappingInfo.BuilderConfiguration();this.config.setTrailingSlashMatch(this.useTrailingSlashMatch());this.config.setContentNegotiationManager(this.getContentNegotiationManager());if (this.getPatternParser() ! null) {this.config.setPatternParser(this.getPatternParser());Assert.isTrue(!this.useSuffixPatternMatch !this.useRegisteredSuffixPatternMatch, Suffix pattern matching not supported with PathPatternParser.);} else {this.config.setSuffixPatternMatch(this.useSuffixPatternMatch());this.config.setRegisteredSuffixPatternMatch(this.useRegisteredSuffixPatternMatch());this.config.setPathMatcher(this.getPathMatcher());}super.afterPropertiesSet(); }在设置了一堆配置之后最终调用的还是 AbstractHandlerMethodMapping 的initHandlerMethods 方法。 protected void initHandlerMethods() {// 获取spring容器中的beanNameString[] var1 this.getCandidateBeanNames();int var2 var1.length;for(int var3 0; var3 var2; var3) {String beanName var1[var3];if (!beanName.startsWith(scopedTarget.)) {// 通过beanName映射出methodHandlerthis.processCandidateBean(beanName);}}// 初始化handlerMethodsthis.handlerMethodsInitialized(this.getHandlerMethods());}protected void processCandidateBean(String beanName) {Class? beanType null;try {// 通过beanName获取当前的类型beanType this.obtainApplicationContext().getType(beanName);} catch (Throwable var4) {if (this.logger.isTraceEnabled()) {this.logger.trace(Could not resolve type for bean beanName , var4);}}// 当前beanName对应的类定义不为空并且带有Controller 或 RequestMapping注解时对其进行处理if (beanType ! null this.isHandler(beanType)) {this.detectHandlerMethods(beanName);}}可以看到最终处理控制器时是调用了detectHandlerMethods 方法。具体内容如下 protected void detectHandlerMethods(Object handler) {// 通过beanName获取到对应的类型Class? handlerType handler instanceof String ? this.obtainApplicationContext().getType((String)handler) : handler.getClass();if (handlerType ! null) {// 获取你自己定义的控制器类型Class? userType ClassUtils.getUserClass(handlerType);// 将类中符合条件标注了RequestMapping注解的 method 映射为 RequestMappingInfo 对象并放入map中这一步的实现在其子类中。并且聚合它们的请求路径。MapMethod, T methods MethodIntrospector.selectMethods(userType, (method) - {try {return this.getMappingForMethod(method, userType);} catch (Throwable var4) {throw new IllegalStateException(Invalid mapping on handler class [ userType.getName() ]: method, var4);}});// 记录日志if (this.logger.isTraceEnabled()) {this.logger.trace(this.formatMappings(userType, methods));} else if (this.mappingsLogger.isDebugEnabled()) {this.mappingsLogger.debug(this.formatMappings(userType, methods));}// 方法注册methods.forEach((method, mapping) - {Method invocableMethod AopUtils.selectInvocableMethod(method, userType);this.registerHandlerMethod(handler, invocableMethod, mapping);});}}这里对方法的处理分了两步第一步根据类型简单处理注解主要是聚合了请求路径。聚合后的结果如下 可以看到这里的路径属性已经有值了。 然后就是注册方法了。 而真正注册的方法registerHandlerMethod 是在其子类中实现的。具体内容如下 在其父级的实现中注册的结果如下 最后简单处理RequestBody注解如果使用了该注解参数必填。 2.2 DispatcherServlet 的初始化 框架中定义了自动配置类 DispatcherServletAutoConfiguration。其有个内部类 DispatcherServletConfiguration 对 DispatcherServlet 进行了配置。具体如下 Conditional({DefaultDispatcherServletCondition.class}) ConditionalOnClass({ServletRegistration.class}) EnableConfigurationProperties({WebMvcProperties.class}) protected static class DispatcherServletConfiguration {protected DispatcherServletConfiguration() {}Bean(name {dispatcherServlet})public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {DispatcherServlet dispatcherServlet new DispatcherServlet();dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());return dispatcherServlet;}BeanConditionalOnBean({MultipartResolver.class})ConditionalOnMissingBean(name {multipartResolver})public MultipartResolver multipartResolver(MultipartResolver resolver) {return resolver;} }在第一节设计原理的时候提到过DispatcherServlet 也是一个servlet 。那么它的初始化也就包含在servlet的生命周期中。 在servlet生命周期中有 init 方法进行初始化。FrameworkServlet 有一个父类HttpServletBean其中定义了初始化方法。虽然不是原生的servlet 初始化方法但是也是会间接调用到的通过模版方法设计模式由子类代为实现 public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware 在FrameworkServlet 触发初始化时会执行到 initServletBean 方法。其中有两个比较关键初始化方法具体如下 篇幅原因这里只拿出关键代码。initWebApplicationContext()内有这样一段在处理请求时会执行到 if (!this.refreshEventReceived) {synchronized(this.onRefreshMonitor) {this.onRefresh(wac);} }而 onRefresh 由子类DispatcherServlet 重写后就成了这样 protected void onRefresh(ApplicationContext context) {this.initStrategies(context); }protected void initStrategies(ApplicationContext context) {// 初始化上传文件解析器initMultipartResolver(context);// 初始化本地解析器initLocaleResolver(context);// 主题处理器initThemeResolver(context);// 映射处理器initHandlerMappings(context);// 处理适配器initHandlerAdapters(context);// 异常处理器initHandlerExceptionResolvers(context);// 请求到视图名的翻译器initRequestToViewNameTranslator(context);// 视图解析器initViewResolvers(context);// 初始化FlashManagerinitFlashMapManager(context); }如果大家想看看这里执行的内容以及初始化后的结果可以自行打断点查看。这里因为东西较多我就不截图了。 PS: 下一小节以 HandlerMappings 为例进行说明 2.3 DispatcherServlet#initHandlerMappings(…) 初始化示例说明 private void initHandlerMappings(ApplicationContext context) {this.handlerMappings null;if (this.detectAllHandlerMappings) {// 获取所有的handlerMappingMapString, HandlerMapping matchingBeans BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);// 对handlerMapping进行排序if (!matchingBeans.isEmpty()) {this.handlerMappings new ArrayList(matchingBeans.values());AnnotationAwareOrderComparator.sort(this.handlerMappings);}} else {try {// 获取名字是 handlerMapping 的handlerMappingHandlerMapping hm (HandlerMapping)context.getBean(handlerMapping, HandlerMapping.class);this.handlerMappings Collections.singletonList(hm);} catch (NoSuchBeanDefinitionException var4) {}}// handlerMappings为空需要设置默认的handlerMappingif (this.handlerMappings null) {this.handlerMappings this.getDefaultStrategies(context, HandlerMapping.class);if (this.logger.isTraceEnabled()) {this.logger.trace(No HandlerMappings declared for servlet this.getServletName() : using default strategies from DispatcherServlet.properties);}}Iterator var6 this.handlerMappings.iterator();while(var6.hasNext()) {HandlerMapping mapping (HandlerMapping)var6.next();if (mapping.usesPathPatterns()) {this.parseRequestPath true;break;}} }默认情况下如果配置了使用全部会有以下handlerMapping 另外补充一句如果使用默认的handlerMapping需要配置DispatcherServlet.properties。 三、工作原理 这一小节以DispatcherServlet 为起点分析SpringMvc的工作原理。 // todo 待完善–预计2024春节后补充春节期间玩去了。
http://www.yingshimen.cn/news/55642/

相关文章:

  • 网站开发推广广东营销网站建设服务
  • 罗湖网站建设的公司哪家好自适应网站怎么做移动配置
  • 网站建设及网站推广益阳建设公司网站
  • 义乌购物网站建设多少钱wordpress你访问的网站不存在
  • 如何建设网站pdflogo图案设计
  • 快速做效果图的网站叫什么区别17一起做网站普宁站
  • 住房城乡建设部网站首页做公司网站要注意哪些问题
  • 网站 建设ppt模板傻瓜一键自助建站系统
  • 营销网站建设广西做网站需要前置审批
  • 专做程序员招聘的网站番禺核酸检测点
  • 静态手机网站网上商城购物系统流程图
  • 有专门做英文字幕的网站吗wordpress主题 二次元
  • 怎样让百度收录自己的网站胶州网站搭建公司
  • 手机网站设计规范甜品网站建设方案
  • 安卓移动网站开发详解广州开发区
  • title 网站建设聊城做网站信息
  • 传奇网站发布网做网站需要哪些技术人才
  • 山西省建设工程信息网站西安免费做网站电话
  • 网站的优化和推广方案网络公司给销售公司做网站
  • 鲅鱼圈网站开发wordpress 重复文章
  • 哈尔滨建设网站公司上海网站建设公司排行
  • 网站logo怎么做才清晰WordPress生成图片
  • 母婴用品购物网站制作做物流行业网站
  • 安顺市住房与城乡建设局网站最新新闻事件今天长沙
  • 夏津网站建设电话网站调用字体
  • 黄页网站推广app咋做广告万能造假截图生成器
  • 天津模板建站哪家好网站建设的支持条件
  • 净水机企业网站源码网站及新媒体建设办法
  • 深圳政务服务网官网首页seo搜索引擎优化招聘
  • 室内设计专业网站怎么弄网站关键词