@Autowired和@Resource是Spring/SpringBoot项目中用于依赖注入的注解。它们都提供了将依赖对象注入当前对象的功能,但是两者有很多不同,这也是面试常见的问题之一,所以今天就来聊一聊。@Autowired和@Resource的区别主要体现在以下5点:来源不同;依赖查找的不同顺序;不同的支持参数;依赖注入的不同用法;编译器IDEA的不同提示。1、来源不同@Autowired和@Resource来自不同的“父类”,其中@Autowired是Spring定义的注解,而@Resource是Java定义的注解,来自JSR-250(Java250规范提案)。小知识:JSR是JavaSpecificationRequests的缩写,意思是“JavaSpecificationProposal”。任何人都可以向Java官方提交JSR,但只有最终确定的JSR才会以JSR-XXX的格式发布,比如JSR-250,发布的JSR可视为Java语言的规范或标准。2.依赖注入的作用根据查找顺序不同,先在SpringIoC容器中查找对象,然后在当前类中引入对象注入。有两种类型的搜索实现:按名称搜索(byName)或按类型搜索(byType)。@Autowired和@Resource都使用名称搜索和类型搜索,但它们搜索的顺序不同。截然相反。2.1@Autowired查找顺序@Autowired是先按类型(byType)查找,如果有多个bean,再按名称(byName)查找。其具体查找过程如下:关于以上过程,大家可以查看org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues实现分析,源码执行流程如下图所示:2.2@Resource查找顺序@Resource先根据名称查找,如果(根据名称)找不到,则根据类型Search,其具体过程如下图所示:以上过程可以在Spring源码的org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues中分析。@Resource虽然是JSR-250定义的,但是是由Spring实现的。其源码实现如下:2.3查找顺序总结从上面的分析可以得出:@Autowired先按类型(byType)查找,如果有多个(Bean)再按名称查找(byName));@Resource先根据名称(byName)查找,如果找不到(根据名称),再根据类型(byType)查找。3、支持的参数不同。@Autowired和@Resource都可以在使用时设置参数。例如,为@Resource注解设置名称和类型参数。实现代码如下:@Resource(name="userinfo",type=UserInfo.class)privateUserInfouser;但是两者支持的参数和参数个数完全不同。其中@Autowired只支持设置一个必需的参数,而@Resource则支持7个参数。支持的参数如下图所示:4.依赖注入支持不同的@Autowired和@Resource支持依赖注入的不同用法。常见的依赖注入有以下三种实现方式:属性注入、构造函数注入和setter注入。这三种注入的实现代码如下。a)属性注册@RestControllerpublicclassUserController{//属性注册@AutowiredprivateUserServiceuserService;@RequestMapping("/add")publicUserInfoadd(Stringusername,Stringpassword){returnuserService.add(username,password);}}b)构造方法注册@RestControllerpublicclassUserController{//构造方法注册privateUserServiceuserService;@AutowiredpublicUserController(UserServiceuserService){this.userService=userService;}@RequestMapping("/add")publicUserInfoadd(Stringusername,Stringpassword){returnuserService.add(username,password);}}c)Setter注入@RestControllerpublicclassUserController{//Setter注入privateUserServiceuserService;@AutowiredpublicvoidsetUserService(UserServiceuserService){this.userService=userService;}@RequestMapping("/add")publicUserInfoadd(Stringusername,Stringpassword){returnuserService.add(用户名,密码);其中@Autowired支持属性注入、构造函数注入和Setter注入,而@Resource只支持属性注入和Setter注入,使用@Resource实现构造函数注入时会提示以下错误:5.编译器提示不同时使用IDEA专业版编写依赖注入代码,如果注入了Mapper对象,那么使用@Autowired编译器会提示错误信息,错误信息内容如下图所示:虽然IDEA会出现错误消息,但程序可以正常执行。那么,如果我们把依赖注入的注解改成@Resource,就不会出现这个错误信息了。具体实现如下:总结@Autowired和@Resource都是用来实现依赖注入的注解(在Spring/SpringBoot项目中),但是两者有5个区别:来源不同:@Autowired来自于Spring框架,@Resource来自(Java)JSR-250;依赖查找的顺序不同:@Autowired先按类型查询,再按名称查询,而@Resource先按名称查询,再按类型查询;支持的参数不同:@Autowired只支持设置1个参数,而@Resource支持设置7个参数;依赖注入的使用支持不同:@Autowired不仅支持构造函数注入,还支持属性注入和Setter注入,而@Resource只支持属性注入和Setter注入;编译器IDEA的提示不同:在注入Mapper对象时,使用@Autowired注解编译器会提示错误,而使用@Resource注解则不会提示错误。Reference&Acknowledgmentswww.cnblogs.com/felordcn/p/13063802.htmlblog.csdn.net/CPLASF_/article/details/109225213是非自评,名誉自定,得失由数论。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
