范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

彻底弄懂ControllerServiceComponent

  今天主要聊聊@Controller 、@Service和@Component这三个注解的关系和区别。网上很多人对这三个注解进行了详细的解释,但是仅仅局限于理论,个人对于没有经过自己验证的结果总是持怀疑态度,所有花时间研究了一下,也对这三个注解理解的更加透彻。(ps:网上好多回答不一定正确,所以只能自己花时间验证 )
  附上三个注解的源代码:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Indexed public @interface Component { 	String value() default ""; }@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // 关键注解 public @interface Controller { 	@AliasFor(annotation = Component.class) 	String value() default ""; }@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // 关键注解 public @interface Service { 	@AliasFor(annotation = Component.class) 	String value() default ""; }注解扫描
  首先说说这三个注解的关系,从源码中可以看出,@Controller和@Service都派生于@Component,所以三者的使用方式基本没什么差别 。(ps:既然这么设计,那一定是有区别的 )。
  在平时的开发中,我们通常在控制层采用注解@Controller,在业务层采用注解@Service。spring在启动时,有一个非常核心的类ConfigurationClassPostProcessor会对类路径下的所以类进行扫描,将符合条件的bean扫描出来添加到beanDefinitionMap集合中,方便接下来的实例化。具体的扫描过程比较复杂,仅仅贴出核心判断逻辑代码。
  org.springframework.core.type.filter.AnnotationTypeFilterprotected boolean matchSelf(MetadataReader metadataReader) { 	AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); 	return metadata.hasAnnotation(this.annotationType.getName()) || 			(this.considerMetaAnnotations && metadata.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.RequestMappingHandlerMappingprotected boolean isHandler(Class<?> beanType) { 	// 判断扫描出来的bean是否包含注解@Controller, 	// 如果包含,springMVC会将其封装为RequestMappingInfo 	return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || 			AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class)); }private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) { 	// 判断传递进来的方法是否包含@RequestMapping, 	// 如果包含,就将其封装成RequestMappingInfo 	RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class); 	RequestCondition<?> condition = (element instanceof Class ? 			getCustomTypeCondition((Class<?>) element) : getCustomMethodCondition((Method) element)); 	return (requestMapping != null ? createRequestMappingInfo(requestMapping, condition) : null); }@Service分析
  目前@Service本人没有找到其特殊之处,可能spring官方后续会添加特殊的操作吧。@Component分析
  该注解是万能的注解,通常加在配置类上。小结
  实际上有一个注解本文没有具体讲解,它就是@Repository,由于本人没有亲自验证,所以就没有进行分析,怕误导大家。有具体分析并验证过的网友,大家可以一起探讨。
  如果有小伙伴也想验证,可以将断点打在我在文中贴出来的三段核心代码处,在spring启动的时候可以进行调试。具体的代码调用逻辑,可能会在以后的文章中进行分析。

三星ZFlip4预计出货量比ZFlip3多70,三星自信折叠手机将大卖说到可折叠手机,我们首先想到的智能手机品牌就是三星,三星通过GalaxyZ系列在可折叠手机领域闯出了一片天,Zflip3和Zfold3的成功说明了一切。三星相信GalaxyZFli华为发布新一代全屋智能解决方案,80平39999元起。你心动了吗?这两天我看了一些报道,其中有一个网友分享我觉得特别有意思,他说华为这次降价了,80平方全屋智能降低到了刚好四万左右,比去年发布的价格下调了很多!这可能是要PK小米等企业提出的生态智治理虚假WiFi不能只是打地鼠有事出门在外,又不想离开WiFi大概是很多互联网村民的共同心声。为了节约流量成本,一些用户企图通过连接免费WiFi的方式来获得更好的上网体验。然而,这些号称免费的WiFi软件不仅没华为Mate50Pro渲染图颜值高但不完美,超越iPhone13成为抢手货荣耀Magic4Pro终于在万众期待中发布了,荣耀Magic4Pro依然是采用的圆形的相机模块设计,看起来和华为Mate40Pro的外观十分相似。如果华为下一代的旗舰手机华为Mat智能大白敬业爱岗全自动工作的金牌咖啡师轻松爬坡越障的安防巡检员可自动拨电话乘电梯的配送服务员在北京冬残奥会上,这些曾服务于冬奥会的机器人继续上岗,提供全方位智能化的暖心服务。磨粉闷蒸冲泡装杯清理整请不要让我砍单315全民行动臭名远扬的拼夕夕竟然又一次没有上315晚会,大跌眼镜的同时又在意料之中,毕竟大平台都有专业的公关部和法律部,它们总是很擅长玩边缘游戏。前有拼夕夕,后有比它商品质量更堪关于一加的新动态自从我们推出一加2。0已经5个月了,随着我们深入到2022年,我有一些关于一加未来的更新,我想和你分享,一如既往,你我不可思议的社区,仍然在我们所做的一切的最前沿,我想首先感谢你在云健身云买菜云试衣数字技术打造潮流消费方式云健身云买菜云试衣数字新生活时尚云消费在网上买一批预制菜跟着镜子里的教练来一场健身,在云端实现一下魔幻试衣如今,数字技术正在让年轻人的消费行为变得更新鲜有趣,造就了一系列颇具特色的教程注册外区苹果id教程测试机型iphone8Plus测试系统iOS15。1在苹果的AppStore,很多软件在国区找不到,或者说在国区被下架了,我们登录国外AppleID,往往能发现首发不到二百的千米远射筒正准备写一篇远射手电哪家强,有筒友告诉我说骇客家的HT50首发价只要200不到,立即买回一支来,测试后第一时间把评测体验分享给大家。本文所有图片均为本人亲自拍摄。骇客HT50由四节RedmiK40S只要1799元享6期免息近日,Redmi举行RedmiK50新品发布会,这次的发布会上的新品很,手机分别为RedmiK40S,RedmiK50,RedmiK50Pro。我比较推荐大家购买RedmiK40S
上海市发布关于支持本市燃料电池汽车产业发展若干政策电车汇消息11月3日,上海市发改委发布了关于支持本市燃料电池汽车产业发展若干政策的通知,政策自2021年11月1日起实施,有效期至2025年12月31日。政策内容涉及支持整车应用支快讯首德名师课堂暨解静娴教授师资培训南通站圆满举行2021年4月19日,由德国SAUTER钢琴制造公司,雅登音响乐器(上海)有限公司主办,南通雅正宇艺琴行承办的首德名师课堂暨解静娴教授师资培训在南通市北文体中心隆重举行!这是暨南京边缘计算时代,支持私有化部署的低代码平台备受追捧随着数字中国建设的提速,从技术到应用,边缘计算正在快速走入制造企业的信息化菜单。然而,除了媒体广泛关注的通信和算力,定制化的软件开发更容易成为边缘计算落地的瓶颈。这两年火热的低代码YYDS!堪称汽车界潮牌极氪,果然没让人失望成都,一个极具现代个性开放性包容性的城市。它常常以精致独特潮流时尚又饱含古典韵味的城市形象展现在大众面前。这座被称为最适宜人类居住的休闲之都,天府之国,吸引人们向往的除了它优质的环上汽集团以SpreadJS表格技术创新,推动新能源5G建设十三五期间,上海汽车集团股份有限公司(简称上汽集团)不断加快自主掌控的核心技术研发,通过深入推进汽车制造领域电动化智能网联化共享化国际化的新四化战略,布局新能源5G建设,牢牢把握住AustrianAudio新品发布CC8小振膜电容麦克风近几个月奥地利专业音频新星AustrianAudio(奥世声)密集发布多款专业麦克风和耳机新品。继上月发布了全新的OC707和OD505手持舞台话筒之后,本月又推出了新品CC8小振专业制造成就专业之选奥产HiX65开放式耳机说到奥地利制造,相信大家的第一反应基本上就是音频产品。奥地利对专业音频的贡献需要单开一篇来细数。但当那个A字头传奇工厂被关停后,在奥地利只留下了一个被迫失业的设计团队和工厂。当然奥ComponentOne。NET控件集发布更新,加入更多。NET5控件ComponentOneEnterprise是葡萄城推出的一款支持。NETCore平台完美集成VisualStudio的。NET控件集,内置300多种。NET控件,可满足WinFo360联手哪吒造的车周鸿祎只要10万元日前,360集团智能汽车战略媒体沟通会在北京举行。360集团创始人董事长周鸿祎宣布,360集团战略投资哪吒汽车,完成全部投资后,将成为哪吒汽车第二大股东,360将持续为哪吒汽车提供连看两部韩美谍战片,真的可以看出东西方文化差异最近上映的新片太少,找些经典老片重温一下历史的精彩。周末连看两部谍战片,分别是马特达蒙的特务风云和全智贤的暗杀。特务风云讲述CIA创始人之一的传奇生涯,其中人物情感心理性格的变化,理想和现实主义的差异大到你无法想象所有电影的开始你都无法预料接下来会发生什么,正如这部名为罗曼先生,你好的电影。一个满腹改变世界的理想,空有一肚子理论知识才华于一身,但看起来与周围的人与环境总显得格格不入,你视他为