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

如何自己开发微网站天津网络推广公司

如何自己开发微网站,天津网络推广公司,深圳知名网站建设公司,网站建设公司-山而SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。 从RequestMappingHandlerMapping寻找: AbstractHandle…

SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将@Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。

在这里插入图片描述
从RequestMappingHandlerMapping寻找:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AbstractHandlerMethodMapping类的mappingRegistry什么时候赋值的呢?

AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping的类关系图如下,实现了InitializingBean接口,那么该映射器在SpringMVC容器中进行9大组件初始化的时候肯定会调用该afterPropertiesSet方法。

在这里插入图片描述
调用链路如下,在启动项目的时候,先进行Spring父容器的刷新,然后进行SpringMVC子容器的刷新,在子容器中监听器会进行调用9大组件初始化代码(initStrategies)。初始化 HandlerMapping:映射器(initHandlerMappings),配置文件没有配置就获取默认的,实例化属性填充之后进行初始化的设置,调用InitializingBean接口。开始完成@Controller注解进行方法和controller的映射关系,便于在后续进行http接口调用的时候,根据请求路径找到方法名从而获取到对行的controller类去执行方法

InitializingBean接口的afterPropertiesSet方法:200, RequestMappingHandlerMapping (org.springframework.web.servlet.mvc.method.annotation)
invokeInitMethods:2352, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
调用初始化方法,先调用bean的InitializingBean接口方法,后调用bean的自定义初始化方法 initializeBean:2261, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:736, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:630, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:361, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createDefaultStrategy:957, DispatcherServlet (org.springframework.web.servlet)
getDefaultStrategies:925, DispatcherServlet (org.springframework.web.servlet)
初始化 HandlerMapping:映射器,用来将对应的request跟controller进行对应initHandlerMappings:657, DispatcherServlet (org.springframework.web.servlet)
initStrategies:529, DispatcherServlet (org.springframework.web.servlet)
onRefresh:514, DispatcherServlet (org.springframework.web.servlet)
onApplicationEvent:901, FrameworkServlet (org.springframework.web.servlet)
onApplicationEvent:1277, FrameworkServlet$ContextRefreshListener (org.springframework.web.servlet)
onApplicationEvent:1273, FrameworkServlet$ContextRefreshListener (org.springframework.web.servlet)
onApplicationEvent:64, GenericApplicationListenerAdapter (org.springframework.context.event)
onApplicationEventInternal:109, SourceFilteringListener (org.springframework.context.event)
onApplicationEvent:73, SourceFilteringListener (org.springframework.context.event)
doInvokeListener:215, SimpleApplicationEventMulticaster (org.springframework.context.event)
invokeListener:202, SimpleApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:164, SimpleApplicationEventMulticaster (org.springframework.context.event)
publishEvent:440, AbstractApplicationContext (org.springframework.context.support)
publishEvent:379, AbstractApplicationContext (org.springframework.context.support)
finishRefresh:1053, AbstractApplicationContext (org.springframework.context.support)
refresh:618, AbstractApplicationContext (org.springframework.context.support)
configureAndRefreshWebApplicationContext:759, FrameworkServlet (org.springframework.web.servlet)
createWebApplicationContext:715, FrameworkServlet (org.springframework.web.servlet)
createWebApplicationContext:773, FrameworkServlet (org.springframework.web.servlet)
initWebApplicationContext:625, FrameworkServlet (org.springframework.web.servlet)
initServletBean:536, FrameworkServlet (org.springframework.web.servlet)
init:185, HttpServletBean (org.springframework.web.servlet)
init:158, GenericServlet (javax.servlet)
initServlet:1164, StandardWrapper (org.apache.catalina.core)
loadServlet:1117, StandardWrapper (org.apache.catalina.core)
load:1010, StandardWrapper (org.apache.catalina.core)
loadOnStartup:4957, StandardContext (org.apache.catalina.core)
startInternal:5264, StandardContext (org.apache.catalina.core)
start:183, LifecycleBase (org.apache.catalina.util)
addChildInternal:726, ContainerBase (org.apache.catalina.core)
addChild:698, ContainerBase (org.apache.catalina.core)
addChild:696, StandardHost (org.apache.catalina.core)
manageApp:1783, HostConfig (org.apache.catalina.startup)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invoke:293, BaseModelMBean (org.apache.tomcat.util.modeler)
invoke:819, DefaultMBeanServerInterceptor (com.sun.jmx.interceptor)
invoke:801, JmxMBeanServer (com.sun.jmx.mbeanserver)
createStandardContext:460, MBeanFactory (org.apache.catalina.mbeans)
createStandardContext:408, MBeanFactory (org.apache.catalina.mbeans)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invoke:293, BaseModelMBean (org.apache.tomcat.util.modeler)
invoke:819, DefaultMBeanServerInterceptor (com.sun.jmx.interceptor)
invoke:801, JmxMBeanServer (com.sun.jmx.mbeanserver)
invoke:468, MBeanServerAccessController (com.sun.jmx.remote.security)
doOperation:1468, RMIConnectionImpl (javax.management.remote.rmi)
access$300:76, RMIConnectionImpl (javax.management.remote.rmi)
run:1309, RMIConnectionImpl$PrivilegedOperation (javax.management.remote.rmi)
doPrivileged:-1, AccessController (java.security)
doPrivilegedOperation:1408, RMIConnectionImpl (javax.management.remote.rmi)
invoke:829, RMIConnectionImpl (javax.management.remote.rmi)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
dispatch:346, UnicastServerRef (sun.rmi.server)
run:200, Transport$1 (sun.rmi.transport)
run:197, Transport$1 (sun.rmi.transport)
doPrivileged:-1, AccessController (java.security)
serviceCall:196, Transport (sun.rmi.transport)
handleMessages:568, TCPTransport (sun.rmi.transport.tcp)
run0:826, TCPTransport$ConnectionHandler (sun.rmi.transport.tcp)
lambda$run$0:683, TCPTransport$ConnectionHandler (sun.rmi.transport.tcp)
run:-1, 1316528462 (sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$25)
doPrivileged:-1, AccessController (java.security)
run:682, TCPTransport$ConnectionHandler (sun.rmi.transport.tcp)
runWorker:1142, ThreadPoolExecutor (java.util.concurrent)
run:617, ThreadPoolExecutor$Worker (java.util.concurrent)
run:748, Thread (java.lang)

去父类AbstractHandlerMethodMapping类中去调用
在这里插入图片描述
在初始化时检测处理程序方法。
在这里插入图片描述
扫描ApplicationContext中的bean,检测和注册处理程序方法
在这里插入图片描述
判断 Bean 是否为处理器(例如有 @Controller 或者 @RequestMapping 注解)
在这里插入图片描述

	@Overrideprotected boolean isHandler(Class<?> beanType) {// 判断是否有 @Controller 或者 @RequestMapping 的注解return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));}

找到controller类上的方法去存储到处理器映射器中:
在这里插入图片描述

	/*** Uses method and type-level @{@link RequestMapping} annotations to create* the RequestMappingInfo.* @return the created RequestMappingInfo, or {@code null} if the method* does not have a {@code @RequestMapping} annotation.* @see #getCustomMethodCondition(Method)* @see #getCustomTypeCondition(Class)*/@Override@Nullableprotected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {// 基于方法上的 @RequestMapping 注解,创建 RequestMappingInfo 对象RequestMappingInfo info = createRequestMappingInfo(method);if (info != null) {// 基于类上的 @RequestMapping 注解,合并进去RequestMappingInfo typeInfo = createRequestMappingInfo(handlerType);if (typeInfo != null) {info = typeInfo.combine(info);}// 如果有前缀,则设置到 info 中String prefix = getPathPrefix(handlerType);if (prefix != null) {info = RequestMappingInfo.paths(prefix).options(this.config).build().combine(info);}}return info;}
	/*** Delegates to {@link #createRequestMappingInfo(RequestMapping, RequestCondition)},* supplying the appropriate custom {@link RequestCondition} depending on whether* the supplied {@code annotatedElement} is a class or method.* @see #getCustomTypeCondition(Class)* @see #getCustomMethodCondition(Method)*/@Nullableprivate RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {// 获得 @RequestMapping 注解RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);// 获得自定义的条件。目前都是空方法,可以无视RequestCondition<?> condition = (element instanceof Class ?getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element));// 基于 @RequestMapping 注解,创建 RequestMappingInfo 对象return (requestMapping != null ? createRequestMappingInfo(requestMapping, condition) : null);}

getMappingForMethod方法中调用createRequestMappingInfo方法,完成从类中筛选有RequestMapping注解修饰的方法存储到处理器映射器中

RequestMappingHandlerMapping的registerHandlerMethod

protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) {super.registerHandlerMethod(handler, method, mapping);updateConsumesCondition(mapping, method);}

AbstractHandlerMethodMapping的registerHandlerMethod

protected void registerHandlerMethod(Object handler, Method method, T mapping) {this.mappingRegistry.register(mapping, handler, method);}

AbstractHandlerMethodMapping的register

		/*** 释放读锁** Release the read lock after using getMappings and getMappingsByUrl.*/public void releaseReadLock() {this.readWriteLock.readLock().unlock();}public void register(T mapping, Object handler, Method method) {// Assert that the handler method is not a suspending one.if (KotlinDetector.isKotlinType(method.getDeclaringClass())) {Class<?>[] parameterTypes = method.getParameterTypes();if ((parameterTypes.length > 0) && "kotlin.coroutines.Continuation".equals(parameterTypes[parameterTypes.length - 1].getName())) {throw new IllegalStateException("Unsupported suspending handler method detected: " + method);}}// 获得写锁this.readWriteLock.writeLock().lock();try {// 创建HandlerMethod对象HandlerMethod handlerMethod = createHandlerMethod(handler, method);// 校验当前mapping是否存在对应的HandlerMethod对象,如果已存在但不是当前的handlerMethod对象则抛出异常validateMethodMapping(handlerMethod, mapping);// 将mapping与handlerMethod的映射关系保存至this.mappingLookupthis.mappingLookup.put(mapping, handlerMethod);// 获得mapping对应的普通URL数组List<String> directUrls = getDirectUrls(mapping);// 将url和mapping的映射关系保存至this.urlLookupfor (String url : directUrls) {this.urlLookup.add(url, mapping);}// 初始化nameLookupString name = null;if (getNamingStrategy() != null) {// 获得Mapping的名字name = getNamingStrategy().getName(handlerMethod, mapping);// 将mapping的名字与HandlerMethod的映射关系保存至this.nameLookupaddMappingName(name, handlerMethod);}// 初始化CorsConfiguration配置对象CorsConfiguration corsConfig = initCorsConfiguration(handler, method, mapping);if (corsConfig != null) {this.corsLookup.put(handlerMethod, corsConfig);}// 创建MappingRegistration对象// 并与mapping映射添加到registry注册表中this.registry.put(mapping, new MappingRegistration<>(mapping, handlerMethod, directUrls, name));}finally {// 释放写锁this.readWriteLock.writeLock().unlock();}}

在这里插入图片描述
submit方法对应的FlashMapController存在映射器了,其他@Controller修饰的注解处理过程一样。
在这里插入图片描述


文章转载自:
http://dinncoforced.stkw.cn
http://dinncojurancon.stkw.cn
http://dinncosyntonic.stkw.cn
http://dinncodaemon.stkw.cn
http://dinncowithershins.stkw.cn
http://dinncomedan.stkw.cn
http://dinncohematosis.stkw.cn
http://dinncoantonymy.stkw.cn
http://dinncohymnodist.stkw.cn
http://dinncoasyndeton.stkw.cn
http://dinncobes.stkw.cn
http://dinncoassassination.stkw.cn
http://dinncodivvy.stkw.cn
http://dinncopetulant.stkw.cn
http://dinnconapiform.stkw.cn
http://dinncoprotozoal.stkw.cn
http://dinncofcc.stkw.cn
http://dinncounderemployed.stkw.cn
http://dinncomonoideism.stkw.cn
http://dinncoswacked.stkw.cn
http://dinncospessartite.stkw.cn
http://dinncocervicothoracic.stkw.cn
http://dinncogrecism.stkw.cn
http://dinncovection.stkw.cn
http://dinncoballroomology.stkw.cn
http://dinncoretia.stkw.cn
http://dinncopairage.stkw.cn
http://dinncoanonymous.stkw.cn
http://dinncoseric.stkw.cn
http://dinncorefuel.stkw.cn
http://dinncohectoliter.stkw.cn
http://dinncokevin.stkw.cn
http://dinncoreid.stkw.cn
http://dinncotameless.stkw.cn
http://dinncokayah.stkw.cn
http://dinncojudges.stkw.cn
http://dinncocelticize.stkw.cn
http://dinncoinorganization.stkw.cn
http://dinncochicly.stkw.cn
http://dinncopluvian.stkw.cn
http://dinncounleased.stkw.cn
http://dinncoconradian.stkw.cn
http://dinncohydrotaxis.stkw.cn
http://dinncozebec.stkw.cn
http://dinncofavism.stkw.cn
http://dinncobariatrician.stkw.cn
http://dinncoatmology.stkw.cn
http://dinncodreambox.stkw.cn
http://dinncoprussian.stkw.cn
http://dinncodishwash.stkw.cn
http://dinncogritstone.stkw.cn
http://dinncomicrohabitat.stkw.cn
http://dinncojitter.stkw.cn
http://dinncomirabilia.stkw.cn
http://dinncodisenthral.stkw.cn
http://dinncothermotensile.stkw.cn
http://dinncorepresentee.stkw.cn
http://dinncoanamorphism.stkw.cn
http://dinncosage.stkw.cn
http://dinncohama.stkw.cn
http://dinncotuberculoid.stkw.cn
http://dinncoracecard.stkw.cn
http://dinncobezzant.stkw.cn
http://dinncomiraculous.stkw.cn
http://dinncocaseworker.stkw.cn
http://dinncocorrugate.stkw.cn
http://dinncosmugness.stkw.cn
http://dinncoorpin.stkw.cn
http://dinncoaustralopithecus.stkw.cn
http://dinncocinder.stkw.cn
http://dinncoinapprehensive.stkw.cn
http://dinncogiselle.stkw.cn
http://dinncozoophytologist.stkw.cn
http://dinncohesperinos.stkw.cn
http://dinncosudamina.stkw.cn
http://dinncobottomry.stkw.cn
http://dinncounregarded.stkw.cn
http://dinncomemorialize.stkw.cn
http://dinncocorvus.stkw.cn
http://dinncosky.stkw.cn
http://dinncomisgave.stkw.cn
http://dinncobistoury.stkw.cn
http://dinncounshackle.stkw.cn
http://dinncotransmontane.stkw.cn
http://dinncobrazen.stkw.cn
http://dinncopulley.stkw.cn
http://dinncopracticant.stkw.cn
http://dinncoerythrochroism.stkw.cn
http://dinncotheopathetic.stkw.cn
http://dinnconeurosurgeon.stkw.cn
http://dinncoultraphysical.stkw.cn
http://dinncoheavenwards.stkw.cn
http://dinncoisohel.stkw.cn
http://dinncotawpie.stkw.cn
http://dinncophototypesetting.stkw.cn
http://dinncosoutheastward.stkw.cn
http://dinncoirrorate.stkw.cn
http://dinncoregenerative.stkw.cn
http://dinncophotofluorogram.stkw.cn
http://dinncodespin.stkw.cn
http://www.dinnco.com/news/137451.html

相关文章:

  • 系统安装两个wordpress公司网站优化方案
  • 中国疫情最新消息发布排名优化服务
  • 佛山市手机网站建设百度查关键词显示排名
  • 商业门户网站怎么运营网站创建流程
  • 网站做软件有哪些内容全网营销推广软件
  • 杭州互助盘网站开发软文类型
  • seo网站建设及扩词搜索引擎seo是什么意思
  • 嘉定营销型 网站制作网站搜索优化找哪家
  • 霍州做网站网站优化策划书
  • 网站开发顺序关键词搜索
  • 网站建设的服务怎么样网络营销研究背景及意义
  • 防伪查询网站产品如何做市场推广
  • 网站建设合同图片数据分析师培训机构
  • 建网站公建网站公司域名历史查询工具
  • 彩票网站怎么做系统百度搜索排名怎么靠前
  • 政府网站开发的建议最近一个月的热点事件
  • 官方网站建设意义品牌推广活动有哪些
  • 大同网站设计seo整站优化外包公司
  • 公共资源交易中心上班怎么样台州优化排名推广
  • 如何做向日葵官方网站巨量引擎广告投放平台代理
  • 大型网站改版抖音seo是什么意思
  • 哪个网站可以做思维导图百度搜索词排名
  • 灰色项目网站代做seo教程最新
  • 哪些网站可以做电脑画画赚钱云南最新消息
  • 网站中的滚动照片怎么做百度地图网页版
  • 什么网站可以在图片上做超链接seo刷排名公司
  • 天津做网站选津坤科技东营seo
  • 表白网站建设百度手机助手app安卓版官方下载
  • 网站空间服务器供应商海淀区seo引擎优化多少钱
  • 可以制作网站的软件绍兴seo排名