纠纷奇闻作文社交美文家庭
聚热点
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

彻底弄懂ControllerServiceComponent

10月6日 霸王亭投稿
  今天主要聊聊Controller、Service和Component这三个注解的关系和区别。网上很多人对这三个注解进行了详细的解释,但是仅仅局限于理论,个人对于没有经过自己验证的结果总是持怀疑态度,所有花时间研究了一下,也对这三个注解理解的更加透彻。(ps:网上好多回答不一定正确,所以只能自己花时间验证)
  附上三个注解的源代码:Target(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedIndexedpublicinterfaceComponent{Stringvalue()}Target({ElementType。TYPE})Retention(RetentionPolicy。RUNTIME)DocumentedComponent关键注解publicinterfaceController{AliasFor(annotationComponent。class)Stringvalue()}Target({ElementType。TYPE})Retention(RetentionPolicy。RUNTIME)DocumentedComponent关键注解publicinterfaceService{AliasFor(annotationComponent。class)Stringvalue()}注解扫描
  首先说说这三个注解的关系,从源码中可以看出,Controller和Service都派生于Component,所以三者的使用方式基本没什么差别。(ps:既然这么设计,那一定是有区别的)。
  在平时的开发中,我们通常在控制层采用注解Controller,在业务层采用注解Service。spring在启动时,有一个非常核心的类ConfigurationClassPostProcessor会对类路径下的所以类进行扫描,将符合条件的bean扫描出来添加到beanDefinitionMap集合中,方便接下来的实例化。具体的扫描过程比较复杂,仅仅贴出核心判断逻辑代码。
  org。springframework。core。type。filter。AnnotationTypeFilterprotectedbooleanmatchSelf(MetadataReadermetadataReader){AnnotationMetadatametadatametadataReader。getAnnotationMetadata();returnmetadata。hasAnnotation(this。annotationType。getName())(this。considerMetaAnnotationsmetadata。hasMetaAnnotation(this。annotationType。getName()));}
  代码解释:
  (1)this。annotationType。getName():获取的是注解Component的全路径名org。springframework。stereotype。Component。
  (2)metadata。hasAnnotation(this。annotationType。getName()):判断当前的类是否直接采用注解Component。
  (3)metadata。hasMetaAnnotation(this。annotationType。getName()):如果当前的类没有直接采用Component,而是采用了类组合注解Controller,判断组合注解Controller中是否包含Component。
  至此,所有添加了注解Controller、Service和Component都被spring扫描出来了。(ps:这就说明了其实在扫描的时候spring其实将这三个注解都按照Component进行扫描的)Controller分析
  如果不使用springMVC时,三者使用其实是没有什么差别的,但如果使用了springMVC,Controller就被赋予了特殊的含义。
  spring会遍历上面扫描出来的所有bean,过滤出那些添加了注解Controller的bean,将Controller中所有添加了注解RequestMapping的方法解析出来封装成RequestMappingInfo存储到RequestMappingHandlerMapping中的mappingRegistry。后续请求到达时,会从mappingRegistry中查找能够处理该请求的方法。
  部分核心代码如下:
  org。springframework。web。reactive。result。method。annotation。RequestMappingHandlerMappingprotectedbooleanisHandler(C?beanType){判断扫描出来的bean是否包含注解Controller,如果包含,springMVC会将其封装为RequestMappingInforeturn(AnnotatedElementUtils。hasAnnotation(beanType,Controller。class)AnnotatedElementUtils。hasAnnotation(beanType,RequestMapping。class));}privateRequestMappingInfocreateRequestMappingInfo(AnnotatedElementelement){判断传递进来的方法是否包含RequestMapping,如果包含,就将其封装成RequestMappingInfoRequestMappingrequestMappingAnnotatedElementUtils。findMergedAnnotation(element,RequestMapping。class);RequestC?condition(elementinstanceofClass?getCustomTypeCondition((C?)element):getCustomMethodCondition((Method)element));return(requestMapping!null?createRequestMappingInfo(requestMapping,condition):null);}Service分析
  目前Service本人没有找到其特殊之处,可能spring官方后续会添加特殊的操作吧。Component分析
  该注解是万能的注解,通常加在配置类上。小结
  实际上有一个注解本文没有具体讲解,它就是Repository,由于本人没有亲自验证,所以就没有进行分析,怕误导大家。有具体分析并验证过的网友,大家可以一起探讨。
  如果有小伙伴也想验证,可以将断点打在我在文中贴出来的三段核心代码处,在spring启动的时候可以进行调试。具体的代码调用逻辑,可能会在以后的文章中进行分析。
投诉 评论 转载

家有宠物和小孩!LG吸尘器长达一个月的体验分享说起LG,估计很多人想到的是LG的电视,包括目前流行的回音壁等电子产品,其实很多人不知道LG做吸尘器也是一绝。在使用了这款LGA9K过后,个人对其产品有了更深入的了解。……Redis内存满了怎么办?缓存淘汰策略And动态内存设定带你头条坚持更文第九天,越努力越幸运,为了未来更好的生活,让我们一起努力加油叭!Code皮皮虾一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有……分享两个网站,再也不怕老人走丢了没事瞎研究手机,发现我的vivo手机里面有个查找手机功能具体位置:设置安全和隐私查找手机需要开启查找手机功能,再通过其他联网设备上网查找手机定位,具体偏差好像好像和……极氪智慧工厂为何能满足大规模的用户个性化需求?提到极氪这个品牌我想大家都不会感到陌生,ZEEKR001作为极氪品牌旗下首款豪华猎装轿跑车型,可以说是2021年热度最高的车型之一。仅仅在发布后两个月的时间就将全年可交付订单全……三项数据表面它是樱桃轴入门机械键盘的放心选择日前,GANSS把C系列104键价格突然拉到299元,而87键低到245元。记得GS104C在我们之前的横评文章《8款入门级樱桃红轴机械键盘测试排名》排在第4名,表现还可以,加……彻底弄懂ControllerServiceComponent今天主要聊聊Controller、Service和Component这三个注解的关系和区别。网上很多人对这三个注解进行了详细的解释,但是仅仅局限于理论,个人对于没有经过自己验证……电脑内存16g和32g,有什么区别?就现在的应用环境来说,绝大部分人是感觉不出16G内存和32G内存的区别的,那是因为WIN10开机日常使用下,16G内存占用率只有20多一点而已,32G内存恐怕只有10多一点的占……一线品牌的集成灶有哪些?题主这个问题,提得有点模糊,因为一线是个很难界定的标准。因为我是业内人士,本来不想回答这个问题的,但是看完楼上各位的答案之后,我觉得:头条现在也算个大媒体,一知半解的东西……通过天猫京东购买iPhone不能在零售店维修?你也信?本文由天极新媒体(公众号ID:yeskyopen)原创11月2日起,苹果将不再接受非官方渠道(第三方)出售的设备维修!!!昨天,关于苹果零售店将不再受理从天猫、京东……中国西电集团研制成功百万千瓦机组用发电机断路器成套装置近日,中国西电集团成功研制百万千瓦机组水电、火电用发电机断路器,并通过集团鉴定验收,综合性能达到国际领先水平,填补了国内空白。这是继集团公司掌握四十万千瓦、六十万千瓦、八十万千……浅谈SoC(SystemOnChip)技术(一)之前我们聊了FGPA的发展历程、实现原理、开发流程等内容。今天我们来聊一聊,现在另一种主流的芯片开发技术,SoC技术。SoC概念狭义上:指在一个芯片上实现信号采集、……喜马拉雅再次提交港股招股书2021年营收58。6亿元财经网科技3月29日讯,据新浪科技消息,中国在线音频平台喜马拉雅今日再次向港交所提交了IPO(首次公开招股)招股书,计划在港上市,此次IPO的承销商为高盛、摩根士丹利和中金公司……
电脑蓝屏提示错误代码0xc0000005的情况要怎么做?手持XR,想换手机,不要低频闪手机,有啥好的推荐?零排放核动力黑科技科考探险船地球300号将下水笔记本降温全攻略!0元起有效降低笔记本温度和风扇噪音腾讯女程序员入职两天辞职,原因竟是不愿加班!同事发出灵魂拷问酷睿i310100(F)适合什么样的用户使用?初学者到底怎么玩抖音才会火,快来看这一篇MIUI12卡顿再见,MIUI13超级流畅你好智能建造构筑未来适合学生党的两部手机!日常使用完全没问题一文带你走进Git的世界这些女司机,看看你能比得过吗?
揭开玛雅金字塔之谜,千年谜团最终解开文在寅:八年后将韩国打造成全球第一个自动驾驶国家切莫盲目跟风作文700字女儿的自我突破,让宝妈欣喜若狂时间管理中常见的5个思维误区,你躺枪几个?失败并不可怕,可怕的是你失去了勇气突然后悔,爱得太迟纽曼A6支持GPS吗疏影华持庵同年读愿丰庄记,赋人生穷富的关键是什么?(二)遵义哪个医院男科好(遵义前列腺医院哪家最好)Xbox负责人将大幅改善MicrosoftStore的游戏体

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形