@Autowired与@Resource:Spring依赖注入注解核心差异剖析
Autowired与ResourceSpring依赖注入注解核心差异剖析在Spring/Spring Boot开发体系中Autowired和Resource是实现依赖注入DI的核心注解二者均能完成依赖对象的注入但在设计背景、查找逻辑、使用方式等维度存在本质区别。这一知识点既是日常开发的高频考点也是面试中考察Spring基础的经典问题本文将从5个核心维度拆解二者的差异帮助开发者精准掌握其使用场景。一、注解来源框架专属 vs 官方标准Autowired和Resource的核心定位差异首先体现在其归属体系的不同Autowired是Spring框架原生定义的注解全类名org.springframework.beans.factory.annotation.Autowired属于Spring生态的“专属工具”仅能在Spring体系中生效。Resource是Java官方规范定义的注解源自JSR-250Java Specification Requests 250即Java规范提案全类名javax.annotation.ResourceJDK 9及以上版本需手动引入依赖。作为Java标准注解它可兼容所有支持JSR-250规范的框架具备跨框架移植性。补充JSR是Java技术规范的提案机制任何组织或个人均可提交JSR提案经官方审核通过后成为Java语言的标准规范JSR-250正是其中关于注解规范的重要提案。二、依赖查找逻辑类型优先 vs 名称优先依赖注入的本质是“从Spring IoC容器中查找目标Bean并注入”而查找方式分为“按类型byType”和“按名称byName”两种二者的查找优先级完全相反1. Autowired先类型后名称Autowired的核心查找逻辑是先按类型匹配类型匹配多个时再按名称匹配具体流程根据注入字段/方法参数的类型在IoC容器中查找所有匹配类型的Bean若找到唯一匹配的Bean直接注入若找到多个同类型Bean则以注入变量名作为Bean名称匹配容器中的Bean名称若名称仍匹配失败抛出NoUniqueBeanDefinitionException异常可配合Qualifier指定Bean名称解决。该逻辑可通过Spring源码org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues方法追溯是Spring对依赖注入的核心实现逻辑。2. Resource先名称后类型Resource的查找逻辑与Autowired相反先按名称匹配名称匹配失败后再按类型匹配具体流程若指定了name参数则直接按该名称查找Bean若未指定name参数则以注入变量名作为Bean名称查找名称查找失败时降级为按注入字段/参数的类型查找若类型仍匹配失败抛出NoSuchBeanDefinitionException异常。尽管Resource是Java标准注解但Spring框架对其提供了具体实现核心源码可参考org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues方法。3. 查找逻辑小结注解查找优先级多Bean匹配处理方式Autowired类型byType→ 名称byName需配合Qualifier指定Bean名称Resource名称byName→ 类型byType直接通过name参数指定Bean名称三、可配置参数极简 vs 灵活二者支持的配置参数数量和用途差异显著直接影响注入的精准度1. Autowired仅支持1个核心参数Autowired仅提供required一个参数布尔类型默认值true表示依赖Bean必须存在若不存在则抛出异常设为false时若容器中无匹配Bean注入值为null不会抛出异常。示例// 非必须注入无匹配Bean时为nullAutowired(requiredfalse)privateUserServiceuserService;2. Resource支持7个扩展参数Resource提供7个可配置参数核心常用的是以下2个name指定要注入的Bean名称精准匹配type指定要注入的Bean类型限定类型匹配其余参数如lookupName、mappedName等为扩展属性日常开发极少使用。示例// 同时指定名称和类型精准注入Resource(nameuserInfoService,typeUserInfoService.class)privateUserInfoServiceuserService;四、注入方式支持全量兼容 vs 部分支持Spring中依赖注入的常见实现方式有3种属性注入、构造方法注入、Setter注入二者的支持范围不同1. 三种注入方式的实现示例1属性注入二者均支持RestControllerpublicclassUserController{// Autowired 属性注入AutowiredprivateUserServiceuserService;// Resource 属性注入ResourceprivateUserServiceuserService2;RequestMapping(/add)publicUserInfoadd(Stringusername,Stringpassword){returnuserService.add(username,password);}}2Setter注入二者均支持RestControllerpublicclassUserController{privateUserServiceuserService;privateUserServiceuserService2;// Autowired Setter注入AutowiredpublicvoidsetUserService(UserServiceuserService){this.userServiceuserService;}// Resource Setter注入ResourcepublicvoidsetUserService2(UserServiceuserService){this.userService2userService;}}3构造方法注入仅Autowired支持RestControllerpublicclassUserController{privateUserServiceuserService;// 合法Autowired 构造方法注入AutowiredpublicUserController(UserServiceuserService){this.userServiceuserService;}// 非法Resource 不支持构造方法注入编译/运行报错// Resource// public UserController(UserService userService) {// this.userService userService;// }}2. 注入方式支持小结注入方式AutowiredResource备注属性注入✅ 支持✅ 支持最常用的注入方式Setter注入✅ 支持✅ 支持符合JavaBean规范构造方法注入✅ 支持❌ 不支持Resource使用会直接报错五、IDE编译提示有警告 vs 无提示在IDEA尤其是专业版开发中二者的语法检查提示存在明显差异核心体现在Mapper接口注入场景Autowired注入MyBatis Mapper接口时IDEA会提示“Could not autowire. No beans of ‘XXXMapper’ type found”警告。这是因为Mapper接口由MyBatis动态代理生成BeanIDEA静态扫描无法识别但程序实际运行不受影响。Resource注入Mapper接口时无任何警告提示语法检查更友好。解决方案若想消除Autowired的警告可给Mapper接口添加Repository注解或在IDEA中关闭“Spring Core → Autowiring for Bean Class”的检查规则。核心总结Autowired和Resource虽均实现依赖注入但核心差异可归纳为5点来源不同Autowired是Spring专属Resource是Java标准注解查找逻辑Autowired先类型后名称Resource先名称后类型配置参数Autowired仅支持required参数Resource支持7个扩展参数注入方式Autowired支持构造方法注入Resource仅支持属性/Setter注入IDE提示注入Mapper时Autowired有警告Resource无提示。最佳实践建议Spring纯生态项目优先使用Autowired配合Qualifier处理多Bean贴合Spring原生逻辑跨框架移植/Mapper注入优先使用Resource兼容性更好且无IDE警告构造方法注入场景必须使用AutowiredResource不支持精准指定Bean名称优先使用Resource无需额外注解更简洁。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2436776.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!