SpringBoot中@Autowired与@Resource的区别小结
作者:coding侠客
本文主要介绍了SpringBoot中@Autowired与@Resource的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
最近接手了离职同事负责的业务,在处理一个线上工单的时候,看了下历史逻辑,在阅读他们写的代码时,发现他们竟然把@Autowired和@Resource注解混用。今天就借此机会聊聊SpringBoot项目中这两者之间的区别。
1. 注解来源
- @Autowired:是Spring框架提供的注解。IOC特性的核心注解之一。
- @Resource:是Java的标准注解,属于Java EE 规范(JSR-250)。
2. 注入方式
- @Autowired:默认按类型进行注入。如果业务场景比较复杂,一个接口有多个实现类的话,可以结合@Qualifier注解指定具体的bean。如:
@Service public class SomeService { @Autowired @Qualifier("userServiceImpl1") private UserService userService1; @Autowired @Qualifier("userServiceImpl2") private UserService userService2; // 业务逻辑 }
- @Resource:默认按名称进行注入,即name属性。如果name属性没有指定,则按类型进行注入。
@Service public class SomeService { @Resource private UserService userService; // 业务逻辑 }
在这种情况下,Spring 会尝试查找名称为 userService 的 bean。如果找不到按名称匹配的 bean,它会再尝试按类型进行匹配。如果按类型匹配也找不到唯一的 bean,就会抛异常。
用一句话总结就是:@Autowired相当于是@Resource的子集。
3. 依赖检查
- @Autowired:默认情况下,它要求依赖的 bean 必须存在于容器中。如果找不到匹配的 bean,Spring 会抛出 NoSuchBeanDefinitionException 异常。可以通过将 required 属性设置为 false 来改变这种行为,使依赖变为可选的,这个时候注入的bean就是null。如:
@Service public class SomeService { @Autowired(required = false) private UserService userService; // 业务逻辑 }
- @Resource:没有类似 required 这样明确的属性来控制依赖是否必须存在。当按名称或者类型无法找到匹配的 bean 时,会抛出NameNotFoundException 或 NullPointerException 异常。
4. 使用场景选择
- @Resource更适合在需要严格按名称注入的场景下使用。
在 Java EE 环境中更常见,因为它符合 Java EE 标准。 - @Autowired是 Spring 生态系统中最常用的依赖注入方式。对于 Spring 生态系统的开发者来说,使用频次很高。特别是在处理复杂的依赖关系和需要灵活配置的场景下,通过结合 @Qualifier 注解,可以实现精准的依赖注入。
当然,本人也更喜欢使用@Autowired。
到此这篇关于SpringBoot中@Autowired与@Resource的区别小结的文章就介绍到这了,更多相关SpringBoot @Autowired与@Resource内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!