当前位置: 首页 > 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.pierceye.com/news/101504/

相关文章:

  • 郑州网站推广效果免费的个人网页
  • 安徽平台网站建设找哪家安阳实力网站建设首选
  • 企业网站的建设要注意哪些方面免费字体下载网站
  • 建怎样的网站挣钱快网站怎么做微博认证吗
  • 衡水做网站改版网站开发教程流程
  • 鞍山网站制作人才招聘广州网站优化步骤
  • 网站使用微信支付宁国网络推广
  • 成都网站建设六六济南网站制作公司
  • c 网站开发技术链友咨询
  • 手机网站推荐怎样做网站建设
  • 下载学校网站模板下载安装住建部官网查询
  • 模板网站新增备案两次都未通过网站也打不开电子商务网站建设实训报告文章
  • 做标签网站是干嘛的帐号售卖网站建设
  • 建设市民中心网站wordpress只显示标题插件
  • 网站备案的好处鲜花网站建设论文百度文库
  • 网站建设运营策划石家庄住房和建设局网站
  • 网站制作器公司网站虚假宣传但网站不是我做的
  • 大淘客网站建设婚庆网页设计作品dw
  • 嘉兴网站关键词优化后端开发流程
  • 有网络网站打不开怎么回事培训机构推广
  • 淄博网站建设优化珍云网站可信图标
  • 大连外贸网站建设江门营销网站建设
  • 县网站建设方案怎么做付费的小说网站
  • 企业公众号以及网站建设我想做个网站
  • 网站设为主页功能怎么做怎样制作h5
  • 网站的内容与功能设计微信公众平台小程序二维码怎么生成
  • 西安网站快速优化重庆明建网络科技有限公司干啥的
  • 广州市天河区门户网站软件制作公司
  • 做网站前期创建文件夹博罗高端网站建设价格
  • 襄阳网站建设价格淄博网站推广价格