面试突击78:@Autowired 和 @Resource 有什么区别? |
您所在的位置:网站首页 › toxication和intoxication区别 › 面试突击78:@Autowired 和 @Resource 有什么区别? |
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它。@Autowired 和 @Resource 的区别主要体现在以下 5 点: 来源不同; 依赖查找的顺序不同; 支持的参数不同; 依赖注入的用法不同; 编译器 IDEA 的提示不同。 1.来源不同@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)。 小知识:JSR 是 Java Specification Requests 的缩写,意思是“Java 规范提案”。任何人都可以提交 JSR 给 Java 官方,但只有最终确定的 JSR,才会以 JSR-XXX 的格式发布,如 JSR-250,而被发布的 JSR 就可以看作是 Java 语言的规范或标准。 2.依赖查找顺序不同依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找有分为两种实现:按名称(byName)查找或按类型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名称查找又使用了类型查找,但二者进行查找的顺序却截然相反。 2.1 @Autowired 查找顺序@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找,它的具体查找流程如下: @Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找,它的具体流程如下图所示: 由上面的分析可以得出: @Autowired 先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找; @Resource 先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找。 3.支持的参数不同@Autowired 和 @Resource 在使用时都可以设置参数,比如给 @Resource 注解设置 name 和 type 参数,实现代码如下: @Resource(name = "userinfo", type = UserInfo.class) private UserInfo user;但二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数,支持的参数如下图所示: @Autowired 和 @Resource 支持依赖注入的用法不同,常见依赖注入有以下 3 种实现: 属性注入 构造方法注入 Setter 注入这 3 种实现注入的实现代码如下。 a) 属性注入 @RestController public class UserController { // 属性注入 @Autowired private UserService userService; @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }b) 构造方法注入 @RestController public class UserController { // 构造方法注入 private UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }c) Setter 注入 @RestController public class UserController { // Setter 注入 private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }其中, @Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入,当使用 @Resource 实现构造方法注入时就会提示以下错误: 当使用 IDEA 专业版在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息,报错内容如下图所示: @Autowired 和 @Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同: 来源不同:@Autowired 来自 Spring 框架,而 @Resource 来自于(Java)JSR-250; 依赖查找的顺序不同:@Autowired 先根据类型再根据名称查询,而 @Resource 先根据名称再根据类型查询; 支持的参数不同:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数; 依赖注入的用法支持不同:@Autowired 既支持构造方法注入,又支持属性注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入; 编译器 IDEA 的提示不同:当注入 Mapper 对象时,使用 @Autowired 注解编译器会提示错误,而使用 @Resource 注解则不会提示错误。 参考 & 鸣谢 www.cnblogs.com/felordcn/p/13063802.html blog.csdn.net/CPLASF_/article/details/109225213 是非审之于己,毁誉听之于人,得失安之于数。公众号:Java面试真题解析 面试合集:https://gitee.com/mydb/interview |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |